欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 运维知识 > linux >内容正文

linux

Linux kernel 学习笔记(1) --分段分页保护机制

发布时间:2025/3/21 linux 43 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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) --分段分页保护机制的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。