段的分类
段可以分为非系统段--数据段、代码段和系统段
这依赖于段描述符中用于标示类型的S标志
当S为0时,此描述符描述的是系统段,否则便是描述一个非系统段
系统段指的是局部描述符表LDT;任务状态段TSS;调用门;中断门;陷阱门;任务门。
S为1时,又会依赖于段描述符中的TYPE字段(TYPE具有四位,依据段类型,各位含义也会不同)。若TYPE.3(最高位)为0,则此时的段描述符代表的是数据段,TYPE.2-E是扩展方向,TYPE.1-W是可写位,TYPE.0-A是已访问位。若TYPE.3为1,则此时的段描述符代表的是代码段,TYPE.2-C是一致代码段,TYPE.1-R是可读位,TYPE.0-A是已访问位。
根据W的标志,数据段是只读,还是可以读/写。根据R的标志,代码段是只执行,还是可以执行/读。
我们常说的堆栈段呢?堆栈段其实也是一个数据段,只是这个数据段必须是可读/写的。
CPL:当前正在执行程序或任务的特权级,存放在代码段寄存器CS和堆栈段寄存器SS的最低两位中。
DPL:段或门的特权级,存放在段或门描述符的DPL字段中。
RPL:赋予段选择符的超越特权级,存放在选择符的最低两位中,访问非一致代码段时,DPL数值必须不大于CPL和RPL的最大值。
段的一致性
所有数据段都是非一致的,即意味着它们不能被低特权级的程序或过程访问,这和代码段的非一致性不同。
代码段可以是一致性的,也可以是非一致性的。段的一致性与否由段描述符中C标志标示。由一个段切换到另一个段的情况按是否需要调用门而异。
不使用调用门访问一个
非一致代码段时,段描述符中的DPL指出访问该段必须具有的CPL特权级,否则将会产生一般保护异常。RPL的特权级必须比CPL高才能成功切换段。当非一致代码段的段选择符被加载进CS寄存器时,CPL仍然是调用者当前的特权级。
一致代码段时,调用者CPL 特权级不应比DPL高才可以,否则会产生一般保护异常。此时忽略对RPL的检查。
当使用调用门访问一个代码段时,首先要对调用段和调用门进行特权级检查,调用门中的DPL数值必须不小于CPL和RPL的最大值,门调用才可通过,接着继续对调用段和被调用段进行特权级检查。