首页 > 解决方案 > 为什么 x86 分页没有特权环的概念?

问题描述

早在 1982 年,当英特尔发布 80286 时,他们在分段方案(环 0-3)中添加了 4 个特权级别,由全局描述符表 (GDT) 和本地描述符表 (LDT) 中的 2 位指定。

在 80386 处理器中,Intel 增加了分页,但令人惊讶的是,它只有 2 个特权级别(主管和用户),由页目录条目 (PDE) 和页表条目 (PTE) 中的单个位指定。

这意味着仅使用分页的操作系统(如大多数现代操作系统)无法从环 1 和 2 的存在中受益,这可能非常有用,例如,对于驱动程序。(例如,Win9x 经常崩溃,因为它正在将有缺陷的未经检查的驱动程序加载到环 0 中)。

从可移植性的观点来看,ring 1 和 ring 2 的存在是 x86 架构的一个怪癖,便携式操作系统不应该使用它们,因为其他架构只有 2 个权限级别。

但我敢肯定,英特尔工程师在 1985 年设计 386 时并没有考虑到其他平台的可移植性。

那么为什么英特尔不允许分页具有 4 个特权级别,比如分段呢?

标签: x86operating-systemcpu-architecturepagingprivileges

解决方案


在 386 保护模式和 286 中有四个权限级别(称为环):环 0 具有最高权限(操作系统),环 1 和 2 未广泛使用,环 3 具有最低权限(用户应用程序) . 环 0-2 称为“主管”,而环 3 称为“用户”。

当前特权级别 (CPL) 由您正在执行的指令的地址决定,根据代码段的描述符特权级别 (DPL)。有关当前权限级别的更多信息,请参阅CPL 与 DPL 与 RPL。

您所指的位如下。它是映射 4MB 页面(或引用页表的 32 位 PDE)的 32 位页面目录条目 (PDE) 中的位 2。该位称为“用户/主管”(U/S)。该位的值为“0”表示不允许用户模式访问该条目控制的4MB区域。正如您所写,这并不意味着只有“2 个特权级别(主管和用户)”。“主管”级别仍然由三个环组成。这包括与用户响铃一起总共四个响铃。

请参阅 Intel 64 和 IA-32 架构软件开发人员手册第 3A 卷:系统编程指南,第 1 部分的第 4.6 节:

对线性地址的每次访问要么是主管模式访问,要么是用户模式访问。对于所有指令提取和大多数数据访问,这种区别由当前特权级别 (CPL) 决定:当 CPL < 3 时进行的访问是主管模式访问,而当 CPL = 3 时进行的访问是用户模式访问。

因此,CPL 可以是 0、1、2 和 3,有效地具有所有 4 个环。

请从上述手册中找到有关美国国旗的更多信息:

一些操作隐式访问具有线性地址的系统数据结构 [...] 称为隐式主管模式访问,而与 CPL 无关。在 CPL < 3 时进行的其他访问称为显式主管模式访问。访问权限也由控制线性地址转换的分页结构条目指定的线性地址模式控制。如果至少一个分页结构条目中的 U/S 标志(位 2)为 0,则该地址是监督模式地址。否则,该地址是用户模式地址。

PS 我的回答没有解决为什么环 1 和环 0 之间的内存保护与环 3 和环 0/1/2 之间的内存保护不同的问题,所以环 1 和环 2 如果页表不可用entry 无法将它们与 ring 0 区分开来。请参阅解决此问题的 Peter Cordes 的回复。


推荐阅读