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

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

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

使用一个简单的“hello world程序”

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>