CPU 特权环:为啥不使用环 1 和 2?

Posted

技术标签:

【中文标题】CPU 特权环:为啥不使用环 1 和 2?【英文标题】:CPU Privilege Rings: Why rings 1 and 2 aren't used?CPU 特权环:为什么不使用环 1 和 2? 【发布时间】:2011-10-06 07:20:12 【问题描述】:

关于 x86 CPU 特权环的几个问题:

为什么大多数操作系统不使用环 1 和 2?只是为了保持代码与其他架构的兼容性,还是有更好的理由?

有没有实际使用这些环的操作系统?还是它们完全没有使用?

【问题讨论】:

这可能有助于compgroups.net/comp.lang.asm.x86/Privilege-levels-1-and-2 【参考方案1】:

作为一名爱好者的操作系统编写者,我发现因为分页(现代保护模型的主要部分)只有特权(环 0、1、2)和非特权的概念,所以环 1 和 2 的好处是大大减少了。

Intel 拥有 ring 1 和 ring 2 的目的是让操作系统将设备驱动程序置于该级别,因此它们具有特权,但与内核代码的其余部分有些分离。

戒指 1 和 2 在某种程度上是“大部分”特权。他们可以访问主管页面,但如果他们尝试使用特权指令,他们仍然会像 ring 3 那样使用 GPF。所以这对于英特尔计划的驱动程序来说并不是一个糟糕的地方......

也就是说,它们确实在某些设计中有用。事实上,并不总是直接由操作系统。例如,VirtualBox,一个Virtual Machine,将客户内核代码放在环 1 中。我也确信某些操作系统确实使用它们,我只是不认为它是目前流行的设计。

【讨论】:

wHOA VirtualBox 使用 ring 1?!那是纯粹的敬畏!非常感谢您提供的信息,这是一个很好的答案! +1 OS/2 将 Ring 2 广泛用于 I/O 代码。这就是虚拟化如此困难的原因。 来自superuser.com/questions/1402537/…:“在环 1 中运行环 0 代码会导致很多额外的指令错误,因为环 1 不允许执行任何特权指令,其中客人的环 0 包含很多。对于这些故障中的每一个,VMM 都必须介入并模拟代码以实现所需的行为。虽然这可行,但模拟数千个此类故障非常昂贵,并且严重损害了虚拟客户的性能。”【参考方案2】:

从操作系统设计的角度来看,拥有多个特权环是 x86 的一个奇怪之处——大多数其他 CPU 只有两种模式(主管和用户)。因此,将操作系统设计为需要多种特权模式将立即阻止它被移植到任何其他 CPU。此外,许多现代虚拟化包不能正确模拟除 0 和 3 之外的特权级别,这使得使用这些级别的操作系统更难测试。

【讨论】:

【参考方案3】:

根据Ring Security 上的***页面,环 1 和 2 用于驱动程序(环 1)、客户操作系统(环 1)和 i/o 特权代码(环 2),管理程序位于 -1/ 0(取决于管理程序)而不是我之前所说的 1。

但是,额外的两个戒指并没有真正发挥作用,因此很少使用。 TBH,大多数使用环 1 和环 2 的代码都对它们的原始用途进行​​了半重新调整(例如管理程序)。如今,大多数 Windows 代码似乎将系统视为只有两个级别(内核和用户),这可能是由于与进入和离开内核空间相关的开销。

【讨论】:

我想你在某处错过了-。你确定管理程序使用 ring 1? 呵呵,没想到,应该是 -1 中的 hyper-visors 和 1 中的客户操作系统,会很快更新 Windows 只使用了两个环,因为它被设计为在只有两个的其他处理器(现已失效)上运行。 在我看来,切换模式的开销很小。据我了解,只有硬件才能为 cpu 分配更多特权(例如,如果发生 IO 完成的中断)。如果这种特权切换发生在硬件中,我怀疑切换环并非易事。我认为 Windows、Linux 或 MacOS 只使用最极端的两个环,因为架构师将中间环保留用于操作系统托管的虚拟化之类的东西。

以上是关于CPU 特权环:为啥不使用环 1 和 2?的主要内容,如果未能解决你的问题,请参考以下文章

CPU Rings, Privilege, and Protection.CPU的运行环, 特权级与保护

初识KVM之1——虚拟化介绍及创建KVM虚拟机

call

KVM虚拟化介绍

进程管理

自制CPU之学习篇01识别四色环电阻