Linux kernel 学习笔记(1) --分段分页保护机制
使用80x86处理器进行寻址时牵涉到三种不同的地址,其关系如下所示
逻辑地址------------------->线性地址-------------------------->物理地址
(分段) (分页)
分段的保护机制:
一个逻辑地址由两部分组成:段标识符和偏移量。其中偏移量是一个32位长的字段,段标识符是一个16位长的字段,称为段选择符,含有一个13位的段描述符索引,一个1位的GDT和LDT指示位和一个两位的请求者特权级。
请求者特权级(RPL)是用来指示当前CPU的特权级。0代表最高优先级,3代表最低优先级,Linux只用0和3,分别称之为内核态和用户态。
为了快速方便的找到段选择符,处理器提供了段寄存器,段寄存器的唯一目的是存放段选择符,其中CS寄存器中包含一个两位的字段,用来指明CPU的当前优先级(CPL)。
段描述符是由8个字节来表示段的特性,它被保存在全局描述符表(GDT)和局部描述符表(LDT)中,由于段描述符的内容较多,在此不一一介绍。关键的有一个两位表示的描述符特权级(DPL),主要用于限制对这个段的存取,它表示可以访问这个段的最小CPU优先级。
以上三段共提到3个特权级,分别是RPL、CPL和DPL。是不是有点晕了,不着急,下面说明三个的关系。
DPL:描述符特权级(Descriptor Privilege Level)
存储在描述符中的权限位,用于描述代码的所属的特权等级,也就是代码本身真正的特权级。一个程序可以使用多个段(Data,Code,Stack)也可以只 用一个code段等。正常的情况下,当程序的环境建立好后,段描述符都不需要改变——当然DPL也不需要改变,因此每个段的DPL值是固定。
CPL:当前特权级(Current Privilege Level)
是CS register 里bit 0和bit 1 位组合所得的值.在某一时刻就只有这个值唯一的代表程序的CPL。在Linux系统中代表当前处于内核态还是用户态。
RPL:请求特权级RPL(Request Privilege Level)
RPL保存在选择子的最低两位。 RPL 说明的是进程对段访问的请求权限,意思是当前进程想要的请求权限。 RPL 的 值 由程序员自己来自由的设置,并不一定RPL>=CPL,但是当RPL<CPL时,实际起作用的就是CPL了,因为访问时的特权检查是判 断:EPL=max(RPL,CPL)<=DPL 是否成立,所以RPL可以看成是每次访问时的附加限制,RPL=0时附加限制最小,RPL=3时附 加限制最大。所以你不要想通过来随便设置一个rpl来访问一个比cpl更内层的段。
因为你不可能得到比自己更高的权限,你申请的权限一定要比你实际权限低才能通过CPU的审查,才能对你放行。所以实际上RPL的作用是程序员可以把自己的程序降级运行——有些时候为了更好的安全性,程序可以在适当的时机把自身降低权限(RPL设成更大的值)。
段机制中使用特权级实现自己的保护机制
分页的保护机制:
分页机制中将32位的线性地址分成3个域
目录项 (高10位)
页表项(中10位)
偏移量(低12位)
页目录项和页表项具有相同的结构其中与权限有关的有:
Read/Write标志
读写特权,如果为0,表示相应页表或者页是只读的,如果为1,则表示可读写。
User/Supervisor标志
和页表相关的特权级只用两个,如果该标志为0,处于内核态时才能寻址,如果标志为1,总能对页寻址。
总结
以上是生活随笔为你收集整理的Linux kernel 学习笔记(1) --分段分页保护机制的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 在麻省理工读计算机专业,看美国的计算机教
- 下一篇: linux设备驱动——andriod平台