![CPU 如何知道/强制执行段/页访问违规?](https://linux22.com/image/216930/CPU%20%E5%A6%82%E4%BD%95%E7%9F%A5%E9%81%93%2F%E5%BC%BA%E5%88%B6%E6%89%A7%E8%A1%8C%E6%AE%B5%2F%E9%A1%B5%E8%AE%BF%E9%97%AE%E8%BF%9D%E8%A7%84%EF%BC%9F.png)
x86 IA-32
据我了解,从用户空间程序访问内存不涉及操作系统。否则会很慢。
因此,如果分页启用与否,CPU 应该以某种方式知道当前运行的代码可以访问该段/页面。
假设分页已关闭 - 因此 CPU 唯一可以引用(以确定访问权限)的是 GDT 中的段描述符。但是段描述符是否包含有关哪个进程可以使用哪个段的任何信息?
分页已打开 - 页表条目是否包含有关谁可以访问此特定页面的任何信息?
位 2 (U/S) 用户/主管;如果为 0,则不允许用户模式访问此条目引用的 4 KB 页
它确实包含权限级别,但不足以确定当前代码是否有权访问该特定页面。
CPU+MMU 如何在每次内存读/写时不涉及操作系统的情况下保护内存访问?
如果某些恶意进程在段选择器中加载自己的值怎么办?
MMU 是否有操作系统在进程创建/上下文切换时填充的一些数据结构?
答案1
但是段描述符是否包含有关哪个进程可以使用哪个段的任何信息?
是的,段描述符的 DPL 位确定所需的权限级别。
页表条目是否包含有关谁可以访问该特定页面的任何信息?
是的,你提到的美国位。
但不足以确定当前代码是否可以访问此特定页面。
在 x86 上,当前特权级别由寄存器的底部位确定CS
;看获取进程的当前权限级别(环)。
CPU+MMU 如何在每次内存读/写时不涉及操作系统的情况下保护内存访问?
操作系统填充适当的数据结构来告诉MMU什么应该被保护。只有当代码尝试执行“禁止”的操作(实际上可能并未被禁止,例如如果它试图访问不存在但允许访问的内存)。
如果某些恶意进程在段选择器中加载自己的值怎么办?
进程无法加载段选择器的值超出其权限级别。
MMU 是否有操作系统在进程创建/上下文切换时填充的一些数据结构?
是的,您已经提到了其中一些:GDT、页表等。