VxWorks控制台在哪里存储数据

问题描述 投票:0回答:1

我正在使用控制台解决这样的“错误”:

-> strerror(0x23)
value = 22279888 = 0x153f6d0
-> d 0x153f6d0
NOTE: memory values are displayed in hexadecimal.
0x0153f6d0:  5f53 7265 6e72 5f6f 4e45 544f 5553 0050  *S_errno_ENOTSUP.*
0x0153f6e0:  0000 0000 0000 0000 0000 0000 0000 0000  *................*
...
0x0153f7c0:  0000 0000 0000 0000 0000 0000 0000 0000  *................*
value = 0 = 0x0

另外,如果我创建一个新变量:

-> a=6
New symbol "a" added to kernel symbol table.
a = 0x45446f60: value = 6 = 0x6

现在它已存储并可用。但现在我想知道这些字节保存在哪里?控制台是在后台进行内存分配还是为此目的分配了一些内存?我应该担心这会被保存吗?我猜这些数据会存储,直到重启并吃掉mem,只要我正在使用控制台。

我查看了“内核Shell用户指南”,但没有找到答案。 (VxWorks 7.0)

vxworks
1个回答
0
投票

strerror通过错误号返回指向错误文本的指针。错误文本不是一些动态字符串,它是在编译开始之前已知的预定义常量,因此它必须与所有其他常量一起存储在.data segment中,旁边是所有其他初始化数据。无论何时使用相同的参数调用strerror,您都可以获得相同内存区域的相同地址,请随时尝试。

创建新变量是另一回事,它实际上以与malloc / new相同的方式从堆中分配内存。如果在创建新变量后立即调用malloc以获取少量数据(例如16个字节),则可能会使指针真正接近新变量的地址。甚至更多,您可以从控制台调用free &a以正确释放内存,不会出现错误。

如果你愿意,你可以实际学习记忆图

  • 堆栈/堆的开始和大小应该在项目配置中的某个位置确定
  • 您可以要求链接器生成.map文件like this并检查其中的段地址。

因此,无论哪种方式,您都可以通过指针值猜测内存部分

注意,我只使用旧版本的VxWorks(5.5已经有),所以这可能不准确,但主要想法应该没问题。

© www.soinside.com 2019 - 2024. All rights reserved.