我正在研究一个进程的Linux IA-32内存模型,我有一个简单的问题。图片中的灰色区域包含什么?它们仅用于显示记忆的开头和结尾吗?那么,文本是从0x0开始,堆栈是从0xFFFFFFFF开始的吗?
重新打开: 嗨,在操作系统课程中,我正在参加这个问题再次变得相关。具体来说,我需要知道灰色区域包含什么。基于到目前为止的答案,我可以看到它在顶部包含内核代码,在底部包含空指针解除引用页面。但是内核代码是什么?我不认为它是整个操作系统本身,但它可能是嵌入式调度程序,内核库调用还是?
致以最诚挚的问候,Lasse Espeholt
alt text http://img403.imageshack.us/img403/3156/capturecj.png
答案 0 :(得分:9)
我认为这更准确:
答案 1 :(得分:5)
我认为灰色区域只代表未定义大小的区域。程序文本肯定不会从0x0开始,因为大多数操作系统将它们用作无效页面,因此可以轻松捕获空引用。线程堆栈也不会直到0xffffffff,因为通常前四分之一(或一半)内核内存映射到它。
答案 2 :(得分:5)
另请注意,由于address space layout randomization,某些部分的起始地址会随图中的值随机偏移。
答案 3 :(得分:3)
似乎没有人提到过,并非所有可用空间中的内存都必须映射(而且几乎从来没有)。
答案 4 :(得分:2)
请注意,地址空间底部的零页面区域 not 实际上禁止在常见的Linux发行版下使用应用程序。内核曾经这样做,然后最终将决定权交给LSM模块(例如SELinux,AppArmor)。并且它们没有强制执行相同的规则,因此结果可以使进程在0x0处映射内存。这是最近“内核空指针取消引用”漏洞背后的漏洞的一部分。