以前对CPL,DPL,RPL几个概念很不明白,特别是一致代码段和非一致代码段更是迷糊。最近看李忠老师的《X86汇编语言:从实模式到保护模式》,好像对特权级有点理解了,记录下来与大家分享,小白知识,高手匆喷。 处理器提供特权的根本目的在于,尽量限保持特权级不变,也就是说,原来特权级是3,尽量保持在3,如果有请求要跳到0级,那么0级代码执行完毕后,还要返回到特权级3. 有了这个原则,就好办了。当然,有时候低特权还是要请求高特权办些事情,所以高低特权间并非绝对隔离不通。 代码段的特权级检查是很严格的,一般来说,控制转移只允许发生在两个特权级相同的代码间。这个有个比喻,好像一个地方,人分为两个等级,老百姓和公务员,政府是CPU,它要执行特权级检查。那政府的意思显然是在老百姓找公务员办事时,也就是特权级发生改变时,要设置各种关卡来限制检查。毕竟不满足检查,那就一切免谈,那政府就比较省事。但是有时候,老百姓还必须找公务员才能办成事,比如办理居住证,那怎么办呢?对,这时一致代码段出现了。一致代码段的意思是说,我虽然身在公务员层,等级比较高,但是我的心是和老百姓一致的,并且我只为老百姓办事。对应的术语表示就是:一致代码段的C位为1,表示这个代码段为一致代码段,它虽然本身是高特权级的代码段,但是可以让低优先级的程序调用并进入。 但是,老百姓一定清楚,你并不能因为有这样为人民服务的好公务员就觉得自己也是公务员了,公务员还是公务员,老百姓还是老百姓,公务员等级还是比老百姓高,它只是暂时为你服务,对应的术语表示是:一致代码段不是在它的DPL特权级上运行,而是在调用程序的特权级上运行,就是说,当控制转移到一致代码段上运行时,不改变当前的CPL,段寄存器CS的CPL字段不发生变化。所以这时一致代码段完全可以理解为公务员和老百姓一心。 另外一个低特权调用高特权的方法就是调用门了。这就更加形象了,老百姓想找公务员办什么事,什么最简单快捷?走后门。走后门(调用门)有两个方式:jmp far和Call far。 Jmp far不改变当前特权级。这个相当于老百姓自己拿着礼品去找公务员办事,因为是老百姓直接参,特权级不变。Call far相当于你将礼品直接交给公务员,让他来代办,它走公务员特级级高的内部流程,特别级发生变化了,等到事情办完了,特权级再降下来,将结果交给老百姓。 语文水平有限,可能表示不清楚,见谅。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课