大多数保护检查都是在硬件中由 CPU 本身完成的,不需要操作系统方面的太多参与。
操作系统设置了一些特殊的表(页表或段描述符等),其中内存范围具有相关的读取、写入、执行和用户/内核权限,然后 CPU 在内部缓存这些权限。
然后 CPU 在每条指令上检查内存访问是否符合操作系统建立的权限,如果一切正常,则继续。如果试图违反这些权限,CPU 会引发操作系统处理的异常(一种类似于来自 CPU I/O 设备外部的中断的形式)。在大多数情况下,操作系统会在遇到此类异常时简单地终止有问题的应用程序。
在其他一些情况下,它会尝试处理它们并使看似损坏的代码工作。其中一种情况是支持虚拟磁盘内存。当一个区域没有由物理内存备份并且它的数据位于磁盘上的某个位置时,操作系统会将其标记为不存在/不可访问。当应用程序尝试使用该区域时,操作系统会从尝试访问该内存区域的指令中捕获异常,用物理内存支持该区域,用磁盘中的数据填充它,将其标记为存在/可访问并重新启动导致异常的指令。当操作系统内存不足时,它可以将数据从某些范围卸载到磁盘,再次将这些范围标记为不存在/不可访问,并从这些区域回收内存用于其他目的。
在操作系统内核之外运行的软件也可能无法访问 CPU 内存范围的特定硬编码,CPU 也可以轻松地在此处进行检查。
MIPS 似乎就是这种情况(来自“Application Note 235 - Migrating from MIPS to ARM”):
3.4.2 内存保护 MIPS 仅在前面描述的范围内提供内存保护,即在用户模式下不允许地址空间的上 2GB 中的地址。不可能有更细粒度的保护机制。
本文档在其他 MIPS 异常中列出了“MEM - 数据获取页面错误;未对齐的内存访问;违反内存保护”。
如果特定版本的 MIPS CPU 没有任何更细粒度的保护检查,则它们只能由操作系统模拟,并且成本很高。操作系统将需要逐条执行代码指令,或者将其转换为几乎等效的代码,并插入地址和访问检查并执行该代码而不是原始代码。