本文将总结Segment protection:CPL,DPL and RPL相关知识点。

1. CPL,DPL and RPL

1.1 CPL

Current privilege level (CPL) field — (Bits 0 and 1 of the CS segment register.) Indicates the privilege level of the currently executing program or procedure. The term current privilege level (CPL) refers to the setting of this field.

当前权限级别(Current Privilege Level,下简称 CPL) : CPL 表示当前运行的代码的权限。 通过 CS 的 0~1 位两位记录代码的 CPL 值, CPL 可以有 0~3 供 4 个级别,这就是我们常说的 ring 级别(实际上, ring 级别有更广阔的含义)。其中 ring0对应 CPL=0,具有最高权限, 操作系统的内核运行在该权限; ring3 对应 CPL=3,用户程序运行在 ring3。 CPL 值越高权限越低。

1.2 DPL

Descriptor privilege level (DPL) field — (Bits 13 and 14 in the second doubleword of a segment descriptor.) Determines the privilege level of the segment.

描述符权限级别(Descriptor Privilege Level,下简称 DPL): DPL 表示段和门所具有的权限。它表示代码访问某个段或通过某个门时所需要的最低权限。例如某个数据段描述符有 DPL=2,则只有 CPL=0、 1、2 的代码可以访问该数据段, CPL=3 的不能访问。

1.3 RPL

Requested privilege level (RPL) field — (Bits 0 and 1 of any segment selector.) Specifies the requested privilege level of a segment selector.

所要求权限级别(Requested Privilege Level,以下简称 RPL): RPL 比较特殊,它存在于段寄存器的 0~1 位(注意, CS 寄存器的 0~1 位是 CPL),用于程序在访问段时增加一级检查。

2. How to check

程序访问一个段,要通过段寄存器得到段描述符,这样会产生 2 次检查,参与检查的 3 个属性分别是:程序本身的 CPL、段寄存器的 RPL、段描述符的 DPL。 CPL、DPL、 RPL 组合起来的情况有很多种,但只有当 CPL <= DPL 且 RPL <= DPL 时,访问才被允许,其余情况均被拒绝。通常,可以把 RPL 设置成 0 来简化检查,此时,满足 CPL<= DPL 访问即被允许。


3. Materials

详情请参考SDM Vol3 CHAPTER 5 PROTECTION!