使用户空间文本段从 0x8048000 开始的基本原理

使用户空间文本段从 0x8048000 开始的基本原理

我在某处读到(至少从 Linux v. 2.6 开始)所有用户空间代码都放置在虚拟内存地址空间中的加载地址 0x8048000 处。

我自己的观察证实了这一点。我做了一个

cat /proc/......../maps

对于多个进程和进程的第一部分,程序text始终从“0x8048000”开始。

此外,C 库启动代码和所有其他运行时好东西似乎都映射在此默认值之后。

这几乎构成了 128 M 的地址空间,考虑到 0xC0000000 - 0x8048000 仍然是用户空间内容的近 3G 地址空间,这并不是很多。

所以我的问题是为什么?

我们正在处理虚拟地址,VM 工作方式的定义排除了与其他程序的干扰或重叠。

0x00000000 到 0x8048000 范围内是否有一些固定/默认映射?

除了默认起始地址位于页边界上这一事实之外,选择该数字而不是任何其他值的理由是什么?

答案1

我承认以下不是一个很好的答案,但我相信 0x8048000 值已被包含在ELF规格。请参阅该文档中的图 A.4、A.5 和 A.6。这System V ABI Intel 386 架构补充还对 0x8048000 进行了标准化。参见第 3-22 页、图 3-25。 0x804800 被规定为低文本段地址/高堆栈地址。这本身就很奇怪,因为堆栈通常设置在进程内存空间的高地址中,Linux 也不例外。

您可以让 GNU 链接器ld设置 ELF 可执行文件,以便内核将其映射到稍低或稍高的地址。执行此操作的方法因 GCC 和 ld 的版本而异,因此请仔细阅读手册页。这往往表明 0x8048000 并非源自某些硬件要求,而是源自其他考虑因素。

相关内容