x64(x86)提供了 segmentation 与 paging 级的保护措施,x86 提供完整的 segmentation 保护措施,而 x64 提供了有限的 segmentation 保护措施。
对于 segmentation 级的保护来说,processor 定义了 4 个权限级别,为:0 ~ 3 级,0 为最高级别,3 为最低级别。0 级能访问所有的 processor 资源,如:所有指令、I/O的访问权限,一些系统的管理资源等。3 级只能有限度的访问 processor 资源。
对于 paging 级的保护来说,processor 实际上只使用了 2 个权限级别,为:supervisor 与 user 级别。3 级就是 user 权限,而 0 ~ 2 都划分为 supervisor 权限。在相应的 page table entry 结构中只有 1 位表示 supervisor /user 权限。
7.1、 segmentation 级保护措施
在 segmentation 阶段控制访问权限时,定义了 3 个权限级别类型:RPL、CPL 以及 DPL。
RPL(Requestor Privilege Level):在使用 selector 时定义的权限级别类型,表示:你将使用什么样的权限去访问数据。用哪个级别的权限取决于你。在主动发起访问时,使用 0 级还是 3 级去访问完全取决于你。
CPL(Current Privilege Level):表示当前 processor 运行于哪个权限级别。在 Intel 的文档里表明:CPL 存储在 CS 寄存器 selector 里的 RPL(实质上是 DPL) 域里,当发生权限的改变时会更新 CS selector 里的 RPL(实质上是 DPL) 域。没错,的确可以这样理解!
在 AMD 的文档没有明确表明 CPL 就是 CS selector 里的 DPL,只是描述了 CPL 会存储在 processor 内部的寄存器里,但是理解为:CPL 就是 CS selector 里的 DPL 是不会错误。这里有一个很重要线索就是:在 REST# 后,CS selector 的 DPL 是 0,表明实模式的 CPL 是 0 级。
DPL(Descriptor Privilege Level):在 descriptor 里定义了 DPL,表明访问的目标将需要什么级别的权限。这代表一个访问门坎,你需要的权限至少要不能小于这个设定的门坎。
DPL 设为 2 级,那么你最少需要的 RPL 为 2 以及 CPL 为 2。
RPL、CPL 以及 DPL 构造了 x86 & x64 segmentation 阶段的控制访问的权限检查机制。在绝大部分情况下,需要 RPL <= DPL && CPL <= DPL 的访问权限去访问 segment descriptor 或 gate descriptor。
processor 除了对访问权限的检查外,还要围绕 selector、descriptor table、TSS segment 以及 descriptor 等系统数据结构进行相关的检查,如:Null-selector、limit、type 等,以确保当前的执行环境是正确有效的。
阅读(1200) | 评论(0) | 转发(0) |