cpu之DPL,RPL,CPL 之间的联系和区别
官方文档Intel’s software developer manuals,“Privilege Levels” 和 “Checking Caller Access Privileges”这两节。
目前在网上查找的中文资料中,以这篇最为详细,故在此做一步简单的总结以及加入一些个人的理解。有兴趣的同学可以去阅读一下官方文档。
在X86中,存在着3种特权级的描述,分别是CPL,RPL和DPL。
1. CPL,RPL,DPL概念
《x86汇编语言从实模式到保护模式》第十一章和第十四章
-
CPL(CS.RPL)是CS寄存器里bit 0和bit 1 位组合所得的值.在某一时刻就只有这个值唯一的代表程序的CPL。
-
RPL是段选择子里面的bit 0和bit 1位组合所得的值。
-
DPL是段描述符中的特权级, 它的本意是用来代表它所描述的段的特权级。
注意:CS寄存器本身也是存放着段选择子的,但是其bit0和bit1表示的不再是RPL而是CPL。
2. 对数据段和堆栈段访问时的特权级控制
处理器对数据段的访问是通过DS寄存器来进行的。DS寄存器中的段选择子的前12个字节表示描述符索引,指向GDT中的一个段描述符,段描述符的DPL表示该地址段的特权级。DS寄存器的后2bit表示其RPL。
只有当CPL <= DPL 且 RPL <= DPL
的情况下,才能访问相应的数据段(0表示特权级最高,3表示特权级最低)。即此时CS寄存器的最后2个bit的值以及DS寄存器最后两个bit的值均要小于DS寄存器指向的段描述符的DP