AdH*_*nem 16 cpu privileges operating-systems
因此,无论是基于 Linux 还是基于 Windows 的 x86 系统,都只将 ring 0 用于内核模式,而 ring 3 用于用户模式。如果它们最终都只使用其中的两个,为什么处理器甚至可以区分四个不同的环?这在 AMD64 架构上有变化吗?
Jam*_*han 20
有两个主要原因。
第一个原因是,尽管 x86 CPU 确实提供了四环内存保护,但由此提供的保护粒度仅在每段级别。也就是说,每个段都可以设置为从 0 到 3 的特定环(“特权级别”),以及其他保护,例如禁止写。但是可用的段描述符并不多。大多数操作系统都希望拥有更细粒度的内存保护。就像...对于单个页面。
因此,请根据页表条目 (PTE) 输入保护。大多数(如果不是全部)现代 x86 操作系统或多或少都忽略了分段机制(无论如何,尽可能多地)并依赖基于 PTE 的保护。这是由标志位指定的,标志位是每个 PTE 中的低 12 位 - 加上支持不执行的 CPU 上的第 63 位。每页有一个 PTE,通常为 4K。
这些标志位之一称为“特权”位。该位控制处理器是否必须处于“特权”级别之一才能访问页面。“特权”级别是 PL 0、1 和 2。但它只是一位,因此在逐页保护级别,就内存保护而言,可用的“模式”数量只有两个:一页可以从非特权模式访问,也可以不访问。因此只有两个戒指。
为了每个页面有四个可能的环,它们必须在每个页表条目中有两个保护位,以对四个可能的环号之一进行编码(就像段描述符一样)。他们没有。
第二个原因是操作系统可移植性的目标。这不仅仅是关于 x86;Unix 告诉我们操作系统可以相对移植到多处理器架构,这是一件好事。有些处理器只支持两个环。通过不依赖体系结构中的多个环,操作系统实现者使操作系统更加便携。
还有第三个特定于 Windows NT 开发的原因。NT 的设计师(David Cutler 和他的团队,是微软从 DEC 西部地区实验室聘请的)以前在 VMS 方面拥有丰富的经验;事实上,卡特勒和其他一些人都是 VMS 的原始设计师。为 VMS 设计的 VAX 处理器(反之亦然)确实有四个环。VMS 使用四个环。(事实上,VAX 在 PTE 中有四个保护位,允许“从用户模式只读,但可从环 2 和内部写入。”但我离题了。)
但是在 VMS 的环 1 和 2 中运行的组件(记录管理服务和 CLI,分别)被排除在 NT 设计之外。VMS 中的 Ring 2 实际上不是关于操作系统安全性,而是关于从一个程序到另一个程序保留用户的 CLI 环境,而 Windows NT 只是没有这个概念;CLI 作为普通进程运行。对于 VMS 的环 1,环 1 中的 RMS 代码必须相当频繁地调用环 0,并且环转换很昂贵。结果证明,直接转到环 0 并完成它比在环 1 代码中进行大量环 0 转换要高效得多。(同样 - 无论如何,NT 都没有像 RMS 这样的东西。)
但是他们为什么会在那里呢?至于为什么 x86 实现了四个环而操作系统没有使用它们——你说的是比 x86 设计更近的操作系统。x86 的许多“系统编程”功能早在 NT 或真正的 Unix-ish 内核在其上实现之前就设计好了,他们并不真正知道操作系统会使用什么。(直到我们在 x86 上进行分页——直到 80386 才出现——我们可以实现真正的 Unix-ish 或类似 VMS 的内核,而无需从头开始重新考虑内存管理。)
现代 x86 操作系统不仅在很大程度上忽略了分段(它们只是设置基地址为 0 且大小为 4 GB 的 C、D 和 S 段;F 和 G 段有时用于指向关键的 OS 数据结构),它们还很大程度上忽略了诸如“任务状态段”之类的东西。TSS 机制显然是为线程上下文切换而设计的,但事实证明它有太多副作用,因此现代 x86 操作系统“手动”完成。例如,x86 NT 更改硬件任务的唯一时间是针对某些真正的异常情况,例如双故障异常。
Re x64,很多这些废弃的特性都被遗漏了。(值得称赞的是,AMD 实际上与操作系统内核团队进行了交谈,并询问他们需要从 x86 中获得什么,他们不需要或不想要什么,以及他们想要添加什么。) x64 上的段仅存在于可能需要的部分中称为残留形式,不存在任务状态切换等。操作系统继续仅使用两个环。
| 归档时间: |
|
| 查看次数: |
2427 次 |
| 最近记录: |