为什么Linux二进制文件的虚拟内存地址从0x8048000开始?

34
在Ubuntu x86系统上反汇编ELF二进制文件时,我注意到代码(.text)部分从虚拟地址0x8048000开始,所有较低的内存地址似乎都未使用。这似乎是相当浪费的,而Google上找到的都是涉及STACK_TOP的民间传说或者防止空指针解引用的保护。后一种情况看起来可以通过使用单个页面而不是留下128MB的间隙来解决。
因此,我的问题是 - 是否有明确的答案来解释为什么布局已固定为这些值,还是只是任意选择?

我不知道确切的答案,但也许这篇文章可以帮助你或者提供有趣的阅读!http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html - Russ Clarke
可能是为什么ELF执行入口点的虚拟地址形式为0x80xxxxx而不是0x0?的重复问题。 - Ciro Santilli OurBigBook.com
1个回答

29

来自Linkers and loaders一书:

在386系统上,文本基地址为0x08048000,这允许一个合理大小的堆栈位于文本下方,同时仍然保持在0x08000000地址以上,从而使大多数程序可以使用单个二级页表。(回想一下,在386上,每个二级表映射0x00400000个地址。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接