操作系统分析——为什么需要RPL,request privilege level

版权声明:本文为博主jmh原创文章,未经博主允许不得转载。 https://blog.csdn.net/jmh1996/article/details/83064384

在学特权级的时候,我们都会知道一共有三个特权级:CPL,DPL,RPL。

CPL和DPL是比较好理解的,CPL是当前CPU所在的特权级,这个值是保存在CS段寄存器的段选择子中的。而DPL则是目标段描述符的特权级。我们想啊,我现在帅的等级为CPL,这个等级可以通过我身上的一个叫做CS的东西知道。然后我想去访问某个地方。这个地方不是可以随便访问的,这些地方是有特权级DPL,世界的法则规定只有CPL<=DPL,我才能去访问这个地方。

而RPL又是什么的呢?这个值就是我们给定的段选择子的最低两位的数值,一般这个值是由程序员来给定的。于是很多人会把这个RPL调为0,假装它的请求特权级都是最高特权的,而让RPL近似于无效。这么看的话,好像RPL没有什么存在的必要性。

其实,RPL通常情况下是的确没有啥作业,因为程序员会把这个值设置为0,而使得RPL检查失效。然而,考虑这么一种情况:

假设某个系统提供一个系统调用sys_fun(segment)。这个系统调用负责从磁盘读一波东西,然后写到一个目标段segment中。

先假设没得RPL,CPU只基于CPL和DPL来实施特权级保护。
调用者的CPL一般处于ring3特权级。通过系统调用,系统的CPL由ring3翻转到了ring0。既然CPL等于ring0了,那么无论目标的segment是多少都可以往里面写数据了。如果调用者故意把目标Segment填成0x0008。即内核段的代码段。那就完蛋了,内核的代码机会被覆盖掉。这肯定是不被操作系统设计员和CPU容忍的。

于是,如果有一个东西能够记录调用者之前所在的旧CPL就好啦,然后在写入目标segment的时候,先把目标segment的RPL改成旧的CPL,就可以解决这个问题。

而这正是RRL可以发挥作用的地方!也就是说,在这类情况下,CPU是会把目标操作数的Segment里面的RPL修改掉的,而不是用户自己填入的。

猜你喜欢

转载自blog.csdn.net/jmh1996/article/details/83064384