据我所知,所有段寄存器或选择器都设置为指向32位保护模式平面模型中4gb段的相同起始地址。那么如何实现堆栈段功能,它从顶层地址之一开始向下扩展或向上增长的堆段功能。
是否实现了4gb地址空间中操作系统拥有的部分内存?
答案 0 :(得分:1)
堆栈段(SS
)与其他段没有区别:它从0开始,长度为4GB。
x86分割的有趣之处在于它独立于分页。因此,OS实现了对平面内存模型的分页。它正处于操作系统实现内存保护的分页中。
因此,当OS启动一个线程时,它会在平面段中为堆栈分配一些内存页面,并使ESP
/'RSP'寄存器指向它。重要的细节是保留堆栈正下方的第一页和不来分配它。这样,堆栈溢出很容易被检测为页面错误。
内核的内存通常映射到4GB内存映射的较高部分,但由于页面保护位,普通用户代码无法访问。