我想到的一个猜测是,英特尔打算在 Ring 1 代码运行时,is主管,“主管”环3代码。环 1 未运行under ring 0.
如果环 1 代码想要调用环 0 代码,它可以通过调用门进行调用,环 0 代码可以将 CR3 更改为页表,其中包含环页表中不存在的物理页的映射使用了 1 或 2 个代码。
我真的对这个东西了解不多,但是https://wiki.osdev.org/Task_State_Segment https://wiki.osdev.org/Task_State_Segment显示 TSS 包含 CR3 字段,因此使用硬件任务切换我猜测通过调用门进行调用可以直接触发 CR3 更改。 (所以调用目标not已经必须被映射,否则环 1 / 2 代码可能会修改它。或者它可以与页表本身和 GDT 一起映射为只读,以通过修改它来阻止环 1 代码接管环 0。)
这意味着操作系统仅使用分页[...] 无法从环 1 和环 2 的存在中受益
这是你的错误:你不能“仅使用分页”。即使在普通 x86 操作系统(具有平面内存模型)上从用户空间进行中断处理也需要设置 TSS 内容,以在切换到内核模式时将 ESP 设置为内核堆栈指针,即使您不使用硬件任务-交换。
x86 有“任务门”和“调用门”以及各种非常复杂的东西,我希望我不必完全理解,但我希望花一些时间阅读它可能会对这些事情有所了解386 的架构师认为操作系统可能想做。
Separate from my previous guess (about ring 1 supervising ring 3), perhaps Intel expected OSes to use segmentation to separate ring 1 / 2 from ring 0 memory in the same page table if desired1. As you say, they probably weren't trying to create something that portable microkernel OSes could just use as a bonus.
内核可以自行决定虚拟地址空间的布局,因此它可以很好地分配其中的块供环 1 代码使用,在调用它时适当地设置 CS/DS/ES/SS。
不过,我认为这意味着非平面模型,因为 x86 分段使地址从 0.. 限制开始 https://wiki.osdev.org/Segment_Limits,不是例如允许访问从低到高的一系列虚拟地址,而不改变指针的含义。
脚注1:
在ring 0和ring 1之间是否需要有完整的内存保护?操作系统可能将环 1 用于半可信代码。
一些特权指令需要环 0,因此环 1 可以阻止意外发生。 IO权限级别可以单独设置,以允许cli
and in
/out
在环 > 0 中,但其他指令如invlpg https://www.felixcloutier.com/x86/invlpg, lgdt https://www.felixcloutier.com/x86/lgdt:lidt, and mov cr, reg https://www.felixcloutier.com/x86/mov-1需要实际的环 0。