这是一个很好的问题,它确实涉及到一些关于安全和虚拟化的很酷的细节。我将简要概述英特尔处理器上的工作原理。
操作系统如何管理正常进程?
英特尔处理器有 4 个不同的“保护环”,可以随时使用。当前运行代码的环决定了可能运行的特定汇编指令。环 0 可以运行所有特权指令,而环 3 不能运行任何特权指令。
操作系统内核始终在环 0 中运行。该环允许内核执行它所需的特权指令,以控制内存、启动程序、写入硬盘驱动器等。
用户应用程序在环 3 中运行。该环不允许运行特权指令(例如用于写入 HDD 的指令)。如果应用程序尝试运行特权指令,处理器将从进程中获取控制权并引发内核将在 ring 0 中处理的异常;内核可能会终止进程。
戒指 1 和 2 往往不会被使用,尽管它们有用处。
Further reading
虚拟化如何工作?
在硬件支持虚拟化之前,虚拟机监视器(例如 VMWare)需要做一些称为二进制转换的事情(参见 paper)。概括地说,这包括 VMM 检查客户操作系统的二进制文件并以安全的方式模拟特权指令的行为。
现在英特尔处理器中的虚拟化硬件支持(查找英特尔 VT-x)。除了上面提到的四个环之外,处理器还有两个状态,每个状态包含四个环:VMX根模式和VMX非根模式。
主机操作系统及其应用程序以及 VMM(例如 VMWare)以 VMX 根模式运行。来宾操作系统及其应用程序在 VMX 非 root 模式下运行。同样,这两种模式都有自己的四个环,因此主机操作系统在根模式的环 0 中运行,主机操作系统应用程序在根模式的环 3 中运行,来宾操作系统在非根模式的环 0 中运行,并且来宾操作系统应用程序在非 root 模式的 ring 3 中运行。
当在非 root 模式的 ring 0 中运行的代码尝试执行特权指令时,处理器会将控制权交还给运行在 root 模式下的主机操作系统,以便主机操作系统可以模拟效果并防止来宾无法直接访问特权资源(或者在某些情况下,处理器硬件可以在不涉及主机的情况下模拟效果本身)。因此,客户操作系统可以“执行”特权指令,而无需对硬件资源进行不安全的访问——这些指令只是被截获和模拟。客人不能随心所欲 - 只能做主机和硬件允许的事情。
澄清一下,在非 root 模式的 ring 3 中运行的代码如果尝试执行特权指令,将导致向来宾操作系统发送异常,就像在代码中向主机操作系统发送异常一样在 root 模式的 ring 3 中运行会尝试执行特权指令。