用比喻类比说明CPU的特权级DPL - CPL - RPL

首先要弄清,这是CPU的机制,不是操作系统的。

DPL是数据的保密级别

RPL是用户程序调用系统代码去访问数据时,要求系统代码采用的访问权限或访问的保密级别

CRL是代码本身的访问权限级别

只能请求帮忙者降低身份去协助:RPL<=CRL,不能RPL>CRL

但这还有什么意义呢?为什么不自己直接去访问?

这是没弄清,我们的程序代码,是不允许直接访问数据的,是要依靠高访问权限的操作系统去访问数据的,是要依靠R0级别的系统内核去访问数据的。

网上的说明强调的是:RPL是程序请求的访问权限,这句话不清楚,应该是:RPL是程序请求系统代码代劳所访问的数据的数据级别,系统代码以自己的权限才能直接访问数据,然后取出程序要求级别的数据。


 

看了网上一些说明,有的很长很复杂,也有一些比喻,但发现这些比喻虽然叫好的多,感觉很容易明白比喻故事本身,但这故事根本没对上路数,没比喻说明清楚三者关系。

有:

 
第13章 特权级DPL - CPL - RPL
笔记总结:

原书(自己动手写操作系统)没有怎么看懂,所以在网上找到了一些资料,感觉明白了许多,所以一一转贴过来,可能对大家的理解有些帮助。要想真正搞懂CPL,DPL和RPL,还是得去K Intel64 and IA32 编程手册3A 4.5 PRIVILEGE LEVELS和4.10.4 Checking Caller Access Privileges (ARPL Instruction)。

一、三者的定义与区别
1、1.当前特权CPL(Current Privilege Level)
CPL是当前进程的权限级别(Current Privilege Level),是当前正在执行的代码所在的段的特权级,存在于cs寄存器的低两位。
2、2.描述符特权级DPL(Descriptor Privilege Level)
DPL存储在段描述符中,规定访问该段的权限级别(Descriptor Privilege Level),每个段的DPL固定。
3、3.请求特权级RPL(Request Privilege Level)
RPL保存在选择子的最低两位。RPL说明的是进程对段访问的请求权限,意思是当前进程想要的请求权限。
RPL的值由程序员自己来自由的设置,并不一定RPL>=CPL,但是当RPL<CPL时,实际起作用的就是CPL了,因为访问时的特权检查是判断:EPL=max(RPL,CPL)<=DPL是否成立,所以RPL可以看成是每次访问时的附加限制,RPL=0时附加限制最小,RPL=3时附加限制最大。所以你不要想通过来随便设置一个RPL来访问一个比CPL更内层的段。
二、为甚麽在CPL之外增加一个RPL
Intel手册上的解释为:The RPL can be used to insure that privileged code does not access a segment on behalf of an application program unless the program itself has access privileges for that segment.
(RPL能够用来确保具有特权级的代码不会代表另一个应用程序去访问一个段,除非那个应用程序具有访问那个段的权限.)
比方说:A进程的DPL为0,C进程的DPL为1,现在有一个B进程他的DPL为2,这B进程想委托A进程(外围程序可以访问一致代码段的内核)去访问C的数据(内核可以访问外围数据),
如果没有RPL来限制的话,这样的委托访问是可以成功的,但这样是非常不安全的。
有了RPL以后,A进程在访问C的时候还要受到RPL的约束,此时可以将访问C的选择子的RPL设为B的DPL,这样A的访问权限就相当为EPL=max(RPL,DPL)=2,这样他就无法代表B去越权访问C了。(那还要委托A干嘛?反正B如果不够权限,委托谁都没用;如果B有权限,不用委托别人也可以啊?)
有RPL的情形,CPU同时检查CPL和RPL来判断是否允许对一个段的访问。在低特权级代码调用高特权级代码时,你可以把RPL认为是调用者CPL的影子。即使高特权级代码在运行,但它是应低特权级代码的请求,作为低特权级代码的代理在执行任务,在必要的时候,RPL作为对CPL的覆盖,可以削弱当前执行代码的可访问的区域,从而保证高特权级代码不会代表低特权级代码去访问一个后者没有访问权限的段。
这里有一个问题,就是低特权级代码在向高特权级代码传递段选择子时,可以任意设置RPL。所以x86处理器有一条专门的指令ARPL用来纠正RPL。
三、农民的例子
一个农民(低特权级)请县长(高特权级)打听一种超级种子,如果找到的话帮忙拿一点回来,听闻这种超级种子可让收成倍增。县长说:好!我认识很多当官的,我可以帮你打听一下哪里有,但是有些地方如果需要表示身分的话我只能说我是农民的代理人。县长利用自己的身份很容易找到了种子在哪里---找的时候没有人问起他代表谁。县长问种子管理员可不可以给他一点,管理员说种子不能给农民因为种子还在试验阶段,我们可以给县长让他们带回当地的专家来帮忙一起做试验,但是一定要县长来申请。那你是谁?县长说我是农民的代理人,因为县长保证他会这样回答的(他也不知道那农民是不是专家),管理员当然不给。县长没办法只能告诉农民拿不到种子。这件事里面县长是以县长的身份帮农民找到种子,但需要表示身分的时候他说只是农民的代理人。这样做县长可以帮人但也不会给别人利用。(农民可能把种子拿回来卖钱也说不定,没人知道)
在这里RPL就是县长的另一个身份---农民的代理人也就是农民---他会带在身上,人家没有问他的时候他不会告诉别人,所以别人也就以县长的身分来看待他。当查身份的时候他才告诉你---我是农民的代理人。
四、微服私访的例子
本身你是个县长(CPL=3),你去一个省访问(DPL=1),按理说你就只能接受县长待遇,访问只能由县长访问的地方(DPL=3)。访问的时候需要领一个许可证RPL,它决定你可以访问哪些地方。这个时候你想伪装成总理,于是申请了一个RPL=0许可证(实际表现为传递给操作系统一个RPL=0的段选择符),但检查部门(操作系统内核)发现了你的伪装(通过使用ARPL指令),把你打回原形(让RPL=CPL=3),最后你还是只能访问县长能访问的地方,你的伪装计划失败了。 (这个所谓许可证RPL不是多余吗?为什么不直接看县长身份?)
五、RPL的理解
CPL和DPL都是见字面就能理解含义的。唯独RPL不容易理解。
今天就说说我的理解,将来回头来看看,今天说的到底对不对。
1、- 当前进程的意愿 -
RPL代表了当前进程的意愿(因为是一种request)。注意,是当前进程的意愿而不是别的进程。其次是一种意愿,是否实现还有待CPU的许可。
2、- 不能超越自己的特权级 -
前面的帖子已经说了,RPL可以由当前进程随便写,但是CPU会检查RPL和CPL的取值,如果RPL填写的特权级比自己实际情况还高,CPU就不会认可,仍旧给他当前的权限。
3、- 只能下降权限 -
鉴于上面的原因,使用RPL的真正情况就是当前进程使用比自己低的或者相同的RPL。这种情况最典型的,就是外围程序A调用内核B,然后通过内核B再访问程序C。由于访问的来源是A,所以内核为了安全起见,将RPL(来自A的访问意愿)设置为A的DPL。这样在逻辑上就完整了。内核就不会越俎代庖了。
六、wintel 中的优先级 ring0 ring3
这得从CPU指令系统(用于控制CPU完成各种功能的命令)的特权级别说起。在CPU的所有指令中,有一些指令是非常危险的,如果错用,将导致整个系统崩溃。比如:清内存、设置时钟等。如果所有的程序都能使用这些指令,那么你的系统一天死机n回就不足为奇了。所以,CPU将指令分为特权指令和非特权指令,对于那些危险的指令,只允许操作系统及其相关模块使用,普通的应用程序只能使用那些不会造成灾难的指令。形象地说,特权指令就是那些儿童不宜的东东,而非特权指令则是老少皆宜。
Intel的CPU将特权级别分为4个级别:RING0,RING1,RING2,RING3。Windows只使用其中的两个级别RING0和 RING3,RING0只给操作系统用,RING3谁都能用。如果普通应用程序企图执行RING0指令,则Windows会显示“非法指令”错误信息。尽管有CPU的特权级别作保护,遗憾的是WINDOW98本身漏洞很多,使用Windows 98的系统一天死机n回也是正常的
七、特权级到实际软件的映射
先说下特权级的概念,在保护模式下,系统依靠特权级来实施代码和数据的保护,相当于权限啦。特权级共有4个级别,0,1,2,3,数字越小表示权限越高。如图:
较为核心的代码和数据放在较高(靠内)的层级中,处理器用此来防止较低特权的任务在不被允许的情况下访问处于高特权级的段。为了防止概念混淆,我们不用特权级大小来说明,改为内层(高),外层(低)来讲。

八、我的理解:
DPL是数据允许访问所要求的权限级别
RPL是代码请求别人帮忙时,帮忙者应采用的权限级别
CRL是代码本身的权限级别
只能请求帮忙者降低身份去协助:RPL<=CRL,如果RPL>CRL
但这还有什么意义呢?为什么不自己直接去访问?
因为不允许自己直接去访问,就像不允许自己直接进保密室取文件一样。假设权限从高到低是0-3,你是访问权限2,可以查看保密级别2及之后的文件,而保密室主管是最高权限0,你只能请求保密室主管去取保密级别2及之后的文件,不能要求代你取出保密级别0-1的文件。RPL就是你要求访问的文件保密级别。
保密室主管为你取文件时,会按你本身访问权限及所要求的文件保密级别,取出你有资格访问的文件。这个访问资格只能是在你的权限级别之内,即RPL<=CRL。
所以,准确来讲,RPL是代码调用系统代码去访问数据时,系统代码所使用的数据访问权限。也就是你所能要求的访问权限。感觉还是不如那个比喻来得明白。

保密室主管为你取文件时,会按你本身访问权限及所要求的文件保密级别,取出你有资格访问的文件。这个访问资格只能是在你的权限级别之内,即RPL<=CRL。

所以,准确来讲,RPL是代码调用系统代码去访问数据时,系统代码所使用的数据访问权限。也就是你所能要求的访问权限。感觉还是不如那个比喻来得明白。


其实,没明白过来的原因,就是首先没明白这RPL是谁在使用的权限。RPL其实是供系统内核所使用的,系统内核本身有自己的CRL,而且是最高权限的。系统内核就相当于图书管理员或保密室主管。我们借书或取保密文件都得通过他们经手,不能自己直接进库房去取,我们会提出要取哪个借阅级别的书或哪个保密级别的文件,这个级别就是RPL,是数据的范围;也可以说是我们提出要取哪种访问权限内所允许的文件。

CRL是访问者的访问权限,DRL是被访问者(数据)所要求的访问权限(即保密级别),RPL是访问者向管理员所要求的访问权限或保密级别,如果高过访问者自己的访问权限,就会自动降低到自己的访问权限,如果低于则按要求的低访问权限进行访问。

如果有错误,还望斧正,迫切请求指出错误之处。

没有更多推荐了,返回首页