当前位置: 技术问答>linux和unix
关于内存访问问题, 可能发错区了原先。这里也发一个同样给分。
来源: 互联网 发布时间:2016-10-21
本文导语: 同一个内存为什么我可以读但是不能写,如何判断内存的读写权限。 (gdb) x 0x407f4594 0x407f4594: 0x00000000 (gdb) set *(unsigned int*)0x407f4594 = 0x00000000 Cannot access memory at address 0x407f4594 代码中遇到的问题,是有一个core...
同一个内存为什么我可以读但是不能写,如何判断内存的读写权限。
(gdb) x 0x407f4594
0x407f4594: 0x00000000
(gdb) set *(unsigned int*)0x407f4594 = 0x00000000
Cannot access memory at address 0x407f4594
代码中遇到的问题,是有一个core的产生,
异常的时候有2个寄存器:
r4: 40df4534 r5: 407f6964 (还有 arg0/r26:7f7f8a28, r20:ffff没有太大用处)
异常的代码是下边的第四行,
Program terminated with signal 11, Segmentation fault.
1, 0xc6ecbcd0 : ldh 0xa(%r5),%r20
2, 0xc6ecbcd4 : shladd,l %r20,1,%r20,%ret0
3,0xc6ecbcd8 : add,l %r3,%r22,%r4
4,0xc6ecbcdc : ldw 8(%r4),%r26
问题:为什么方位r4有问题,我认为谢r26肯定没有问题。怀疑是由于内存40df4534不能访问。
但是为什么第一行就可以呢(r5和r4的内存不远呀)
注: r5的内存
(gdb) x 0x407f6964
0x407f6964: 0x00000000
(gdb) set *(unsigned int*)0x407f6964 = 0x0
Cannot access memory at address 0x407f6964
(gdb) x 0x407f4594
0x407f4594: 0x00000000
(gdb) set *(unsigned int*)0x407f4594 = 0x00000000
Cannot access memory at address 0x407f4594
代码中遇到的问题,是有一个core的产生,
异常的时候有2个寄存器:
r4: 40df4534 r5: 407f6964 (还有 arg0/r26:7f7f8a28, r20:ffff没有太大用处)
异常的代码是下边的第四行,
Program terminated with signal 11, Segmentation fault.
1, 0xc6ecbcd0 : ldh 0xa(%r5),%r20
2, 0xc6ecbcd4 : shladd,l %r20,1,%r20,%ret0
3,0xc6ecbcd8 : add,l %r3,%r22,%r4
4,0xc6ecbcdc : ldw 8(%r4),%r26
问题:为什么方位r4有问题,我认为谢r26肯定没有问题。怀疑是由于内存40df4534不能访问。
但是为什么第一行就可以呢(r5和r4的内存不远呀)
注: r5的内存
(gdb) x 0x407f6964
0x407f6964: 0x00000000
(gdb) set *(unsigned int*)0x407f6964 = 0x0
Cannot access memory at address 0x407f6964
|
|
|
不会开发 看多少遍 都不会
|
有些内存是只读的,比如char *p="abcd"; 就不能p[0]=0
对arm不太熟,可能是叫rodata(Read Only)段吧,这个段可能会离正常的全局变量(data或bss)不远。
r4: 40df4534 r5: 407f6964 相差6M,不算很近了。
内存不外乎堆、栈、全局区、常量区,LZ可以试试在这几个区各找一个变量看看地址,就大致能看出来内存分布了。
对arm不太熟,可能是叫rodata(Read Only)段吧,这个段可能会离正常的全局变量(data或bss)不远。
r4: 40df4534 r5: 407f6964 相差6M,不算很近了。
内存不外乎堆、栈、全局区、常量区,LZ可以试试在这几个区各找一个变量看看地址,就大致能看出来内存分布了。
|
有工具可以看可执行文件的分段情况,x86的是readelf,arm的可能是arm-linux-readelf吧
readelf -S a.out 或者
readelf -a a.out
readelf -S a.out 或者
readelf -a a.out
|
arm的段 ro、rw、zi
http://blog.csdn.net/normalnotebook/archive/2006/06/08/781397.aspx
http://blog.csdn.net/TQW4321/archive/2009/04/02/4044092.aspx
http://blog.csdn.net/lufangzheng/archive/2009/12/10/4980900.aspx
http://blog.csdn.net/normalnotebook/archive/2006/06/08/781397.aspx
http://blog.csdn.net/TQW4321/archive/2009/04/02/4044092.aspx
http://blog.csdn.net/lufangzheng/archive/2009/12/10/4980900.aspx
|
这种问题我觉得楼主你不要在判断内存读写权限上下功夫,应该是你程序出错访问的不该访问的内存,简而言之你的程序跑会了,或者被踩了内存。如果要查询内存的访问权限,在内存表pgd,pud等里面有,我记得是最后一张表的低几位用来标识访问权限。
|
学习了!