【发布时间】:2017-10-09 08:56:08
【问题描述】:
据我所知,x86 有专门的寄存器用于指向代码、数据和堆栈段的指针,但没有 bss 和堆段。计算机如何记住这些片段的位置?尤其是堆,因为 bss 直接在数据之后,但堆通常放在内存中的不同位置。
【问题讨论】:
-
您在这里有一个严重的误解。这些段不需要在运行时记住。它们仅用于分配变量。每个变量都有一个位于该段中的地址。
-
但是如果相同的代码没有存储段“偏移量”的指针,怎么能在内存的不同位置运行呢?
-
除非编译为“可重定位”,否则它不能。
-
堆通常由与您的代码链接(静态或动态)的 C 运行程序创建。它决定虚拟地址中的地址,调用操作系统提供的系统调用来映射页面并将地址存储在一些数据结构中,malloc(和函数族)将其用作堆。
-
如果在windows上运行
dumpbin /HEADERS binary.exe,你可以看到bss段的地址和它的大小。在 Linux 上,您可以使用objdump。我相信所需的标志是-x。
标签: c memory-management