Dar*_*tom 5 paging privileges x86 operating-system cpu-architecture
早在 1982 年,当 Intel 发布 80286 时,他们为分段方案(环 0-3)添加了 4 个特权级别,由全局描述符表 (GDT) 和本地描述符表 (LDT) 中的 2 位指定。
在 80386 处理器中,Intel 添加了分页,但令人惊讶的是,它只有 2 个权限级别(主管和用户),由页目录条目 (PDE) 和页表条目 (PTE) 中的单个位指定。
这意味着仅使用分页的操作系统(如大多数现代操作系统)无法从环 1 和环 2 的存在中受益,这对于驱动程序来说可能非常有用。(例如,Win9x 经常崩溃,因为它正在将有问题的未经检查的驱动程序加载到环 0 中)。
从可移植性的角度来看,环 1 和环 2 的存在是 x86 架构的一个怪癖,可移植操作系统不应该使用它们,因为其他架构只有 2 个特权级别。
但我确信,英特尔工程师在 1985 年设计 386 时并没有考虑到其他平台的可移植性。
那么为什么英特尔不允许分页有 4 个权限级别,比如分段?
我想到的一个猜测是,Intel 的意图是,当 Ring 1 代码运行时,它是主管,“监督”Ring 3 代码。不在环 0下运行环 1 。
如果环 1 代码想要调用环 0 代码,它可以通过调用门进行调用,环 0 代码可以将 CR3 更改为页表,其中包含环页表中不存在的物理页的映射使用了 1 或 2 个代码。
我真的不太了解这个东西,但是https://wiki.osdev.org/Task_State_Segment显示 TSS 包含 CR3 字段,因此使用硬件任务切换我猜测通过调用门进行调用可以直接触发CR3变化。(因此调用目标不必已映射,否则环 1 / 2 代码可能会修改它。或者它可以与页表本身和 GDT 一起映射为只读,以阻止环 1 代码通过修改来接管环 0。)
这意味着仅使用分页的操作系统无法从环 1 和 2 的存在中受益
这是你的错误:你不能“仅使用分页”。即使在普通 x86 操作系统(具有平面内存模型)上从用户空间进行中断处理也需要设置 TSS 内容,以在切换到内核模式时将 ESP 设置为内核堆栈指针,即使您不使用硬件任务-交换。
x86 有“任务门”和“调用门”以及各种非常复杂的东西,我希望我不必完全理解,但我希望花一些时间阅读它可能会对这些事情有所了解386 的架构师认为操作系统可能想做。
与我之前的猜测(关于环 1 监督环 3)不同,如果需要的话,英特尔可能希望操作系统使用分段将同一页表中的环 1 / 2 与环 0 内存分开1。正如您所说,他们可能并没有尝试创建可移植微内核操作系统可以用作奖励的东西。
内核可以自行决定虚拟地址空间的布局,因此它可以很好地分配其中的块供环 1 代码使用,在调用它时适当地设置 CS/DS/ES/SS。
不过,我认为这意味着非平面模型,因为 x86 分段使地址从 0..limit 开始,而不是允许在不改变指针含义的情况下访问从 low..high 开始的一系列虚拟地址。
脚注1:
在ring 0和ring 1之间是否需要有完整的内存保护?操作系统可能将环 1 用于半可信代码。
一些特权指令需要环 0,因此环 1 可以阻止意外发生。IO权限级别可以单独设置为允许cli
和in
/out
在环> 0,但其他指令如invlpg
,,lgdt
和mov cr, reg
需要实际的环0。
归档时间: |
|
查看次数: |
237 次 |
最近记录: |