在阅读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的段。
阅读(3764) | 评论(1) | 转发(1) |