最近刚看到CPU的特权级别问题,发现关于关于权限级别有3个使用的地方,就是CPL,DPL和RPL。特权级是保护模式下非常重要的概念,所以有必要搞清楚。
首先来看看他们的定义,根据Intel Developer‘s Menu整理:
CPL:当前执行的程序或者任务的权限级别,保存在CS和SS segment registers的bit[1:0]中。
DPL:一个segment或gate的权限级别,保存在segment或gate的descriptor中的DPL 区域,根据访问的不同种类的segment/gate,DPL的含义不同:
1. Data Segment:若DPL为1,则在CPL为0和1的程序都能访问该数据段。
2. Nonconforming code segment without using a call gate: DPL是多少,就只有CPL=DPL的程序能使用该代码段。
3. Call Gate: 和Data Segment的规则一样。
4. Conforming code segment and nonconforming code segment accessed through a call gate:若被访问的代码段的DPL为2,则运行于CPL为0或1的程序无法访问该代码段。那运行于CPL为3的程序就能访问了???这是因为通过Call gate只能访问权限更高的代码段,高特权级不着地特权级办事,只有低特权级找高特权级帮忙!
5. TSS:和Data Segment的规则一样。
RPL:一个override privilege level,它可以指派给segment selectors。它保存在segment selector中的bit[1:0]中,访问权限需要取MAX(CPL, RPL)。RPL能够用来确保具有特权级的代码不会代表另一个应用程序去访问一个段,除非那个应用程序具有访问那个段的权限。
也就是说:
CPL在Code segment register的[1:0]上,代表了当前程序的权限级别。
DPL保存在segment descriptor(段描述符)中,也就是说在GDT或IDT中。
RPL保存在segment selector中。而segment register保存的就是segment selector中,所以问题就是RPL和CPL到底有什么区别?RPL是数据段或堆栈段的bit[1:0],RPL是可以由程序员自己来设置的,但和CPL不同,CPL由CPU控制,无法被代码修改。