x86 IA-32
在我的理解中,从用户空间程序访问内存不涉及操作系统。否则会很慢。
因此,无论是否启用分页,CPU 都应该以某种方式知道当前正在运行的代码可以访问该段/页面。
假设分页已关闭 - 因此 CPU 唯一可以参考(以确定访问权限)的是 GDT 中的段描述符。但是段描述符是否包含有关哪个进程可以使用哪个段的任何信息?
分页打开 - 页表条目是否包含有关谁可以访问此特定页面的任何信息?
Bit 2 (U/S) 用户/主管;如果为 0,则不允许用户模式访问此条目引用的 4 KB 页面
它确实包含特权级别,但它不足以确定当前代码是否可以访问该特定页面。
CPU + MMU 如何在不让操作系统参与每次内存读/写的情况下保护内存访问?
如果某些恶意进程在段选择器中加载了自己的值怎么办?
MMU 是否有操作系统在进程创建/上下文切换时填充的一些数据结构?
是的,段描述符的 DPL 位决定了所需的特权级别。
是的,你提到的美国位。
在 x86 上,当前特权级别由寄存器的低位决定
CS
;请参阅获取进程的当前特权级别(环)。操作系统填充适当的数据结构来告诉 MMU 应该保护什么。然后只有当代码试图做一些“禁止”的事情时操作系统才会参与(这可能实际上并没有被禁止,例如,如果它试图访问不存在但允许它访问的内存)。
进程不能用超出其权限级别的值加载段选择器。
是的,您已经提到了其中的一些:GDT、页表等。