我正在使用控制台来解决这样的“ 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)
答案 0 :(得分:0)
strerror
按错误号返回指向错误文本的指针。错误文本不是动态字符串,它是在编译开始之前已知的预定义常量,因此必须将其与所有其他常量一起存储在.data segment中,并紧靠所有其他初始化数据。每当您使用相同的参数调用strerror
时,都会获得相同存储区的相同地址,请随时尝试。
创建新变量是另一回事,它实际上以与malloc
/ new
相同的方式从堆中分配内存。如果在创建新变量后立即调用malloc
以获取少量数据(例如16个字节),则指针可能会真正靠近新变量的地址。甚至更多,您可以从控制台调用free &a
以正确释放内存,不会出现错误。
如果愿意,您可以实际学习内存图
所以无论哪种方式,您都可以通过指针值来猜测内存部分
请注意,我只使用了较早版本的VxWorks(5.5版具有),因此这可能并不准确,但是主要思想应该没问题。