gpt4 book ai didi

x86 - 为什么 x86 分页没有权限环的概念?

转载 作者:行者123 更新时间:2023-12-03 15:53:47 24 4
gpt4 key购买 nike

早在 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 个权限级别,比如分段?

最佳答案

我想到的一个猜测是,英特尔打算在运行环 1 代码时,它是主管,“监督”环 3 代码。不是环 1 在环 0 下运行。
如果 ring 1 代码想要调用 ring 0 代码,它可以通过调用门调用,并且 ring 0 代码可以将 CR3 更改为页表,该页表包括页表中不存在的物理页的映射正在使用 1 或 2 个代码。
我真的不太了解这个东西,但是https://wiki.osdev.org/Task_State_Segment显示 TSS 包含一个 CR3 字段,因此使用硬件任务切换我猜测通过调用门调用可以直接触发 CR3 更改。 (所以调用目标不必被映射,否则环 1/2 代码可能已经修改了它。或者它可以被映射为只读,连同页表本身和 GDT,以停止环 1 代码通过修改它来接管环 0。)

This means that an OS that only uses paging [...] unable to benefit from the existence of rings 1 and 2


那是你的错误:你不能“只使用分页”。即使在普通的 x86 操作系统(具有平面内存模型)上进行用户空间的中断处理,也需要设置 TSS 内容,以便在切换到内核模式时将 ESP 设置为内核堆栈指针,即使您不使用硬件任务-交换。
x86 有“任务门”和“调用门”以及各种非常复杂的东西,我希望我不必完全理解,但我希望花一些时间阅读它可能会对这类事情有所了解386 的架构师认为操作系统可能想做。
与我之前的猜测(关于环 1 监督环 3)不同,如果需要,也许英特尔希望操作系统使用分段将环 1/2 与同一页表中的环 0 内存分开1。正如您所说,他们可能并没有尝试创建可移植微内核操作系统可以作为奖励使用的东西。
内核可以决定虚拟地址空间的布局,因此它可以很好地分配由环 1 代码使用的块,在调用它时适本地设置 CS/DS/ES/SS。
不过,我认为这意味着非平面模型,因为 x86 分段使地址 go from 0..limit ,而不是例如允许在不改变指针含义的情况下访问从低到高的一系列虚拟地址。
脚注 1 :
是否有必要在环 0 和环 1 之间进行完整的内存保护?操作系统可能将环 1 用于半可信代码。
一些特权指令需要环 0,所以环 1 会阻止这种意外发生。 IO权限级别可以单独设置允许 cliin/ out in ring > 0,但其他指令如 invlpg , lgdt , 和 mov cr, reg 需要实际的环 0。

关于x86 - 为什么 x86 分页没有权限环的概念?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66053495/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com