C 堆栈和机器指令驻留在内存中的什么位置?
每当我在我的程序(32位,red hat linux)上使用gdb时,我看到寄存器中使用的地址与链接到机器指令的地址相差甚远 使用一个简单的“hello world程序”C 堆栈和机器指令驻留在内存中的什么位置?,c,memory,gdb,heap-memory,stack-memory,C,Memory,Gdb,Heap Memory,Stack Memory,每当我在我的程序(32位,red hat linux)上使用gdb时,我看到寄存器中使用的地址与链接到机器指令的地址相差甚远 使用一个简单的“hello world程序” 0x080483a4:lea0x4(%esp),%ecx 0x080483a8:和$0xfffffff0,%esp 0x080483ab:PUSH-0x4(%ecx) .... info registers命令在其中生成 esp 0xffffb970 0xffffb970 ebp
0x080483a4:lea0x4(%esp),%ecx
0x080483a8:和$0xfffffff0,%esp
0x080483ab:PUSH-0x4(%ecx)
....
info registers命令在其中生成
esp 0xffffb970 0xffffb970
ebp 0xffffb978 0xffffb978
esi 0x9d5ca0 10312864
edi 0x0 0
eip 0x80483b5 0x80483b5 <main+17>
esp 0xffffb970 0xffffb970
ebp 0xffffb978 0xffffb978
esi 0x9d5ca0 10312864
电子数据交换0x0
eip 0x80483b5 0x80483b5
esp和ebp显示的帧位置与代码所在位置非常不同
我想的是
在4gb内存条中,有2^32个内存位置,堆栈更多地位于顶部(0xFFFFFFFF)并向下扩展,像hello程序、操作系统本身、其他当前运行的程序都位于底部并向上扩展(因此它从0x00000000开始),在堆的正下方,也在堆栈所在位置的另一侧
我可能错了,但我希望你们能给我一个答案
另外,是否有关于剩余内存的更多信息?是否有一门课程/一本书涵盖了与我刚才问的内容类似的广泛问题?我觉得我必须用我的汇编语言入门课程来填补很多空白
多谢各位 除非你有一台时间机器,回到20世纪60年代,否则你看到的所有地址都是虚拟地址。它们可能在物理内存中彼此非常接近,但其中一个地址较高,另一个地址较低。如果您的操作系统正在分配4K页面,则只有低12个地址位不会被硬件映射。除非您有一台时间机器,并返回到20世纪60年代,否则您看到的所有地址都是虚拟地址。它们可能在物理内存中彼此非常接近,但其中一个地址较高,另一个地址较低。如果您的操作系统正在分配4K页面,则只有低12个地址位不会被硬件映射。尝试
cat/proc/self/maps
和cat/proc/$$/maps
;阅读、、尝试cat/proc/self/maps
和cat/proc/$$/maps
;阅读关于,
esp 0xffffb970 0xffffb970
ebp 0xffffb978 0xffffb978
esi 0x9d5ca0 10312864
edi 0x0 0
eip 0x80483b5 0x80483b5 <main+17>