VxWorks控制台在哪里存储数据

时间:2019-02-21 11:01:30

标签: vxworks

我正在使用控制台来解决这样的“ errno”问题:

-> 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分配,还是已经为此目的分配了一些RAM? 我应该担心要保存在哪里吗? 我猜这些数据会一直存储到重新启动并耗尽mem为止,只要我使用控制台即可。

我查看了《内核Shell用户指南》,但找不到答案。 (VxWorks 7.0)

1 个答案:

答案 0 :(得分:0)

strerror按错误号返回指向错误文本的指针。错误文本不是动态字符串,它是在编译开始之前已知的预定义常量,因此必须将其与所有其他常量一起存储在.data segment中,并紧靠所有其他初始化数据。每当您使用相同的参数调用strerror时,都会获得相同存储区的相同地址,请随时尝试。

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

如果愿意,您可以实际学习内存图

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

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

请注意,我只使用了较早版本的VxWorks(5.5版具有),因此这可能并不准确,但是主要思想应该没问题。