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

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

这似乎是相当浪费,所有谷歌出现是民间传说涉及STACK_TOP或防止空指针解引用。 后一种情况看起来可以通过使用单个页面来修复,而不是留下128MB空白。

所以我的问题是这样的 – 为什么布局已经被固定到这些值,还是只是一个任意的select有一个明确的答案?

Solutions Collecting From Web of "为什么Linux二进制文件的虚拟内存地址从0x8048000开始?"

从连接器和装载机书:

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