Memory management 现代操作系统上的内存分段:为什么需要4个分段?

Memory management 现代操作系统上的内存分段:为什么需要4个分段?,memory-management,operating-system,Memory Management,Operating System,来自维基百科: “无法在打开时关闭分段 x86处理器,这么多操作系统 系统使用平面内存模型来 使分割不被注意到 例如,Linux 内核只设置4个段“ 我的意思是,既然保护已经由虚拟内存子系统负责(PTE有一个保护位),为什么您需要4段(而不是2段:即数据/代码与DPL 3,因为您可以执行驻留在较低特权段中的代码) 谢谢。您在描述四个部分以及为什么需要所有部分时引用得不够多 然而,通常情况下,隐含段是 用过。所有指令回迁都来了 从CS中的代码段 登记大多数内存引用都会出现 来自DS寄存器中的数据段

来自维基百科:

“无法在打开时关闭分段 x86处理器,这么多操作系统 系统使用平面内存模型来 使分割不被注意到 例如,Linux 内核只设置4个段“

我的意思是,既然保护已经由虚拟内存子系统负责(PTE有一个保护位),为什么您需要4段(而不是2段:即数据/代码与DPL 3,因为您可以执行驻留在较低特权段中的代码)


谢谢。

您在描述四个部分以及为什么需要所有部分时引用得不够多

然而,通常情况下,隐含段是 用过。所有指令回迁都来了 从CS中的代码段 登记大多数内存引用都会出现 来自DS寄存器中的数据段。 处理器堆栈引用 隐式(例如,推送和弹出) 指令)或显式(内存) 使用ESP或(E)BP进行访问 寄存器)使用中的堆栈段 SS寄存器。最后是字符串 说明(如stos、MOV)也包括在内 使用额外的段ES

因此,如果您想建立一个程序员不需要考虑分段的平面模型,那么您需要将所有四个分段寄存器(CS、DS、SS、ES)设置为具有相同的基址。然后,计算出的所有四个地址都是等价的


该页面显示了一个示例,其中所有四个都设置为base=0,limit=4Gb

内核和用户模式有一组单独的段,因此用户模式代码无法写入内核模式数据。那将是一件坏事。

这并不能回答我的问题。在保护模式下实现分段的方式是通过一个间接表(即GDT/LDT),因此您仍然可以设置2个分段,并且有2个寄存器指向表中的同一条目……如果没有针对所有4个分段的有效设置,您必须做额外的工作以避免隐式分段引用。如果只设置了CS和DS,则必须在隐式使用SS和ES的指令中使用段覆盖前缀。因此,只需将所有4个设置为相同就容易多了。然后你可以忘记分割的存在。我对x86已经足够生疏了,我可能错过了一些即使使用覆盖前缀也会带来更多麻烦的情况。为什么要打开这罐虫子?设置所有4个选项有什么困难?这是正确答案。另一个答案错误地集中在段寄存器上,而不是段本身。(它错过了6个段寄存器中的2个,
FS
GS
)。段存在于和LDT中。