x86 几个特权级别(CPL,RPL,DPL)
时间:2010-08-03 来源:liujunwei1234
在阅读linux内核的时候,在linux内核的权限保护机制部分,经常会讨论几个特权级别:CPL,RPL,DPL。下面简单讲一下我自己的理解。
背景知识:
1 x86体系结构的几个段寄存器:cs,ds,es,ss.fs.gs 它们无论在实模式下还是保护模式下,都是16位的寄存器,只是功能不而已。 实模式下: 用做段寄存器,用来将逻辑地址转换到线性地址 保护模式下:段选择子,用来作为索引在GDT表或LDT表等中选择段描述符。 主要内容: 1 段选择子基本结构: index TI RPL 13bit 1bit 2bit 因此,段选择子中最低2bit叫做RPL. 作为段选择子的时候,cs和ss比较特殊,它们的RPL代表着当前进程的特权级,因此,二者的RPL又叫CPL。 DPL就不用多说了,段描述符表中的两位。 2 举个例子 mov $0, offset(%ds) 这条指令的地址cs:ip, 那么cs中的最低两位就是cpl,即执行这条指令的当前特权级。 现在要将0写入某个地址,那么就要去查看有没有权限写入,首先检查的就是%ds中的rpl,然后再去检查%ds索引的段描述符中的dpl。假设当前cpl=0, %ds中的rpl =1, 段选择子中的dpl=3,那么cpl的特权级高于dpl,rpl的特权级高于dpl,访问合法。可以这样理解,首先拿当前特权级cpl与段选择子中的rpl比较,得出能不能访问某个段描述符的结论, 然后拿rpl去与段描述符中的dpl比较,就是拿着rpl这个特权级能不能访问实际的段。
cpl先去拿一个特权级别rpl,然后利用取得的这个特权级rpl去访问某个特权级dpl的段。
1 x86体系结构的几个段寄存器:cs,ds,es,ss.fs.gs 它们无论在实模式下还是保护模式下,都是16位的寄存器,只是功能不而已。 实模式下: 用做段寄存器,用来将逻辑地址转换到线性地址 保护模式下:段选择子,用来作为索引在GDT表或LDT表等中选择段描述符。 主要内容: 1 段选择子基本结构: index TI RPL 13bit 1bit 2bit 因此,段选择子中最低2bit叫做RPL. 作为段选择子的时候,cs和ss比较特殊,它们的RPL代表着当前进程的特权级,因此,二者的RPL又叫CPL。 DPL就不用多说了,段描述符表中的两位。 2 举个例子 mov $0, offset(%ds) 这条指令的地址cs:ip, 那么cs中的最低两位就是cpl,即执行这条指令的当前特权级。 现在要将0写入某个地址,那么就要去查看有没有权限写入,首先检查的就是%ds中的rpl,然后再去检查%ds索引的段描述符中的dpl。假设当前cpl=0, %ds中的rpl =1, 段选择子中的dpl=3,那么cpl的特权级高于dpl,rpl的特权级高于dpl,访问合法。可以这样理解,首先拿当前特权级cpl与段选择子中的rpl比较,得出能不能访问某个段描述符的结论, 然后拿rpl去与段描述符中的dpl比较,就是拿着rpl这个特权级能不能访问实际的段。
cpl先去拿一个特权级别rpl,然后利用取得的这个特权级rpl去访问某个特权级dpl的段。
相关阅读 更多 +