Professordeng's Blog

强隔离要求应用程序和操作系统之间有一个硬边界。如果应用程序出错,我们不希望操作系统失败或其他应用程序失败。相反,操作系统应该能够清理失败的应用程序并继续运行其他应用程序。为了实现强隔离,操作系统必须安排应用程序不能修改(甚至读取)操作系统的数据结构和指令,并且应用程序不能访问其他进程的内存。

处理器为强隔离提供硬件支持。例如,X86 处理器和许多其他处理器一样,有两种执行指令的模式:内核模式和用户模式。在内核模式下,允许处理器执行特权指令。例如,读取和写入磁盘(或任何其他 IO 设备)涉及特权指令。如果处于用户模式的应用程序试图执行特权指令,则处理器不会执行该指令,而是切换到内核模式,以便处于内核模式的软件可以清理该应用程序,因为它做了不应该做的事情。应用程序只能执行用户模式指令(例如,加法等),并被称为在用户空间中运行,而处于内核模式的软件执行特权指令,并被称为在内核空间中运行。运行在内核空间(或内核模式)中的软件称为内核。

要在磁盘上读写文件的应用程序必须转换到内核态,因为应用程序本身不能执行 IO 指令。处理器提供一条特殊指令,将处理器从用户模式切换到内核模式,并在内核指定的入口点进入内核(X86处理器为此提供 int 指令)。一旦处理器切换到内核模式,内核就可以验证系统调用的参数,决定是否允许应用程序执行请求的操作,然后拒绝它或执行它。很重要的一点是,内核设置转换到内核模式的入口点;如果应用程序可以决定内核入口点,恶意应用程序可能在跳过参数验证等直接进入内核。