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

Posted

技术标签:

【中文标题】为啥 Linux 二进制文件的虚拟内存地址从 0x8048000 开始?【英文标题】:Why do virtual memory addresses for linux binaries start at 0x8048000?为什么 Linux 二进制文件的虚拟内存地址从 0x8048000 开始? 【发布时间】:2011-02-27 07:53:00 【问题描述】:

在 Ubuntu x86 系统上反汇编 ELF 二进制文件我不禁注意到代码(.text)部分从虚拟地址 0x8048000 开始,并且所有较低的内存地址似乎都未使用。

这似乎相当浪费,所有谷歌出现的要么是folklore involving STACK_TOP,要么是针对空指针取消引用的保护。后一种情况看起来可以通过使用单个页面而不是留下 128MB 的间隙来解决。

所以我的问题是——对于为什么布局被固定为这些值或者它只是一个任意选择有一个明确的答案吗?

【问题讨论】:

我不知道实际答案;但也许这篇文章可能会有所帮助或至少提供有趣的阅读! muppetlabs.com/~breadbox/software/tiny/teensy.html Why is the ELF execution entry point virtual address of the form 0x80xxxxx and not zero 0x0?的可能重复 【参考方案1】:

来自Linkers and loaders 书:

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

【讨论】:

以上是关于为啥 Linux 二进制文件的虚拟内存地址从 0x8048000 开始?的主要内容,如果未能解决你的问题,请参考以下文章

Linux内存从0到1学习笔记(七,用户空间虚拟内存之二 - 内存空间的建立)

字节与内存地址

为啥ELF执行入口点虚拟地址的形式是0x80xxxxxx而不是0x0?

深入理解Linux内核笔记—第02章:内存寻址.md

Linux 内存寻址

Linux 内核 内存管理虚拟地址空间布局架构 ① ( 虚拟地址空间布局架构 | 用户虚拟地址空间划分 )