32位保护模式下如何设置不同的段?

How different segments are set in 32bit protected mode?

据我所知,所有段寄存器或选择器都设置为指向 32 位保护模式平面模型中 4gb 段的相同起始地址。那么堆栈段功能是如何实现的,它是从顶部地址之一开始向下增长还是堆段功能向上增长。

另外,4gb 地址 space 中的 OS 内存的某些部分是如何实现的?

堆栈段 (SS) 与其他堆栈段没有区别:它从 0 开始,长度为 4GB。

x86 分段的有趣之处在于它独立于 分页。所以 OS 在平面内存模型上实现分页。在分页中 OS 实现内存保护。

这样,当OS启动一个线程时,它会为栈分配一些内存页,在flat段,并使ESP/'RSP'寄存器指向给它。重要的细节是保留堆栈正下方的第一页并且 而不是 来分配它。这样,堆栈溢出可以很容易地检测为页面错误。

内核的内存通常映射到4GB内存映射的较高部分,但由于页面保护位,普通用户代码无法访问。