Intel x86处理器内存保护 概要知识点

一旦处理器内存保护机制被启动,处理器就会对每一次内存访问进行保护性检查,以确保所有的访问都满足保护策略。保护检查和地址转换是并行进行的。
保护检查包含段级检查和页级检查。检查顺序是先段后页,检查依据是段描述符,页目录和页表,检查的基础是特权级。
特权级是Intel为实现保护而定义的特权编号。
段一级的检查包括段界限检查,段类型检查,特权级检查,长指针检查等。段一级检查的原则是:
  1. 低特权级的代码不能访问高特权级的数据
  2. 高特权级的代码可以访问低特权级的数据
  3. 代码只能使用与其特权级相同的堆栈,当特权级切换时,堆栈也要随之切换。
  4. 只能向具有相同特权级的非相容代码段转移控制(长JMP和长CALL)
  5. 可以向同等或者较高特权级的相容代码段转移控制,但不能向低特权级的相容代码段转移控制(长JMP和长CALL)。
  6. 即使调用门、中断门、陷阱门,也不能从高特权级向低特权级转移控制。
  7. 不允许使用长RET向高特权级转移控制。
页一级的检查包括特权级检查和读写检查。相关标志是页目录/页表项中的U/S和R/W位。U/S位0的页是超级页,为1是代表用户页。一般情况下,超级页中的代码可以访问所有页(不管R/W标志),用户页中的代码只能访问用户页。当CR0.WP被设置为1时,超级页中的代码也不能写只读用户页。
NXB为1的页只能用作数据页,试图执行数据页的指令会引起处理器异常。