堆栈和机器指令在内存中的位置是什么?

时间:2014-09-20 23:23:22

标签: c memory gdb stack heap

每当我在我的程序(32位,red hat linux)上使用gdb时,我发现寄存器中使用的地址与链接到机器指令的地址相差甚远。

使用简单的" hello world program"

0x080483a4 <main+0>:    lea    0x4(%esp),%ecx
0x080483a8 <main+4>:    and    $0xfffffff0,%esp
0x080483ab <main+7>:    pushl  -0x4(%ecx)
....

info寄存器命令产生

esp            0xffffb970   0xffffb970
ebp            0xffffb978   0xffffb978
esi            0x9d5ca0 10312864
edi            0x0  0
eip            0x80483b5    0x80483b5 <main+17>

那些esp和ebp显示的帧与代码所在的位置非常不同。

我认为是......

在4gb ram棒中,有2 ^ 32个内存位置,堆栈位于顶部(它的位置为0xFFFFFFFF)并向下扩展,类似这些hello程序,操作系统本身,其他当前运行的程序位于底部并且长大(因此它从0x00000000开始),就在堆的正下方,堆也位于堆栈所在的另一侧。

我可能错了,但我希望得到你们的回答。

此外,还有更多关于内存其余部分的信息吗?是否有一门课程/书籍涵盖与我刚才提出的类似的广泛问题?我觉得我必须在我的简介汇编语言课中填写很多空白。

谢谢。

1 个答案:

答案 0 :(得分:4)

除非您有时间机器并且回到1960年代,否则您看到的所有地址都是虚拟地址。它们可能在物理内存中彼此靠近,但仍有一个地址高,另一个低。如果您的操作系统正在分配4K页面,则硬件不会映射低12位地址位。