注:本文所有说到特权级大小的地方都是指的数字。
本文阐述了两部分内容:
1、一致代码段和非一致代码段
2、怎么设置特权级
特权级这部分比较绕,说起来并没有很多东西,但是需要整理整理。
一、一致代码段和非一致代码段
代码段分为一致代码段和和非一致代码段(只有代码段才区分这个,数据段并不区分)。一般我们认识一个新事物需要搞懂两个问题:为什么和怎么做。所以本文会解释为什么做这个区分,和怎么区分的。
做出这个划分主要是因为操作系统要区分内核态和用户态。下面看下表(下表中的高–>低指的是高特权级访问低特权级的代码段):
高-->低 | 低-->高 | 同特权级
一致代码段 不允许 | 允许 | 允许
非一致代码段 不允许 | 不允许 | 允许
非一致代码段只允许同特权级的进程访问,一致代码段允许低特权级访问高特权级的代码,所以相比起来,非一致代码段安全性要高一点。所以内核把自己的核心代码段设置成非一致代码段,把需要和用户共享的代码段设置成一致代码段。
因为这个区分了一致代码段和非一致代码段。
二、怎么设置特权级
特权级有三个,分别是:
1、RPL( Request Privilege Level):请求特权级,进程发出请求的特权级,存储在段选择子中(段选择子详情参见上一篇博文)。
2、CPL(Current Privilege Level):任务特权级,就是进程的特权级,存储在cs低两位中。
3、DPL(Descriptor Privilege Level):描述符特权级,表示该描述符表示的段的特权级,存储在描述符表中。