80386支持两个主要的保护类型:
一类是不同任务之间的保护。它是通过给每一任务分配不同的虚拟地址空间,而每一任务有各自不同的虚拟地址—物理地址的转换映射,因而可实现任务之间的完全隔离。
另一类是同一任务内的保护。定义4种特权级(特权级0、1、2、3),特权级0最高,特权级3最低。每个段都有对应的特权级,访问段时需遵循相应的特权保护规则。
特权级种类:
1、请求特权级——RPL
RPL为选择子的最低2位
2、描述符特权级——DPL
DPL为描述符中属性字节的b6、b5位
3、当前特权级——CPL
CPL = 当前正在执行的代码段的DPL
4、输入输出特权级——IOPL
各种段的特权保护:
1、数据段、附加数据段的特权保护
max{CPL, RPL} ≤ DPL
程序只能访问特权级相同或较低的数据段
例:MOV AX, 01001101B
MOV DS, AX
RPL=01
CPL为这段程序所在代码段的DPL(假设=10)
则该程序所能访问的数据段的
DPL≥ max{CPL, RPL}
即DPL≥ max{10, 01} = 10
即 只能访问特权级为2,3的数据段。
2、堆栈段的特权保护
DPL = RPL = CPL
任务在不同特权级操作时必须有独立的堆栈,否则低特权级的任务会通过堆栈影响高特权级的任务。
3、代码段的特权保护
1)程序段在同特权级之间可以进行控制转移;
2)低特权级的段到高特权级的段通过某些合法的入口点(如“调用门”)也可以进行控制转移;
CPL≤DPL(调用门)
3 )高特权级到低特权级之间的转移是禁止的。
如,操作系统的程序不能调用、跳转到用户的程序。
门描述符格式(P305图9.30)和系统段描述符有差别。它包含一个32位的偏移地址,一个字计数和一个选择子。
调用门描述符由选择子、偏移地址和字计数构成。
选择子和偏移地址指出一个子程序的起始地址,字计数指出有多少参数必须从主程序的堆栈传送到被调用的子程序的堆栈上。对其他门而言,字计数值字段无意义。
4、协调(一致)代码段 (属性字节中C=1)
任何低特权级的过程可直接调用或转移到协调代码段,不必使用调用门,也不必切换堆栈。但转移、调用后CPL不变,仍为调用前的低特权级。
因此,除协调代码段外,调用过程仍不能访问其他高特权级的代码段,只能把协调代码段协调到调用者的特权级。
参考 郁慧娣,东南大学出版社,《微机系统及其接口技术》书第9章9.2、9.3、9.4和第3版教材第8章 8.2