orange's学习--一致代码段和非一致代码段
参考资料
https://blog.****.net/KLKFL/article/details/80650023
一、为什么要定义一致代码段与非一致代码段?
操作系统保护模式下把代码段分为一致代码段和非一致代码段的原因是:内核程序和用户程序要分开,内核程序不能被用户程序干扰。但是有时候用户程序也需要读取内核的某些数据,于是操作系统就从内核程序中分配一些可以供用户程序访问的段,但是不允许用户程序写入数据,
用户程序访问这些段时遵循以下规则:
1,内核程序不知道用户程序的数据,不调用用户程序的数据,也不转移到用户程序中来
2,用户程序只能访问到内核的某些共享段,这些段称为一致代码段
3,用户程序不能访问内核不共享的段
二、一致代码段
一致代码段:简单理解就是操作系统拿出来被共享的代码段,可以被低特权级的用户程序直接调用访问的代码段,
这些代码段,通常是不去访问受保护的资源和某些类型异常处理。
通常这些共享代码,是"不访问"受操作系统保护的资源和某些类型异常处理。比如一些数学计算函数库,为纯粹的数学运算计算,被作为一致代码段.
一致代码段访问限制:
1,特权级高的程序不允许访问特权级低的数据:即内核态不允许调用用户态的数据。
2,特权级低的程序可以访问到特权级高的程序,但是特权级不会改变,即不会从用户态切换到内核态。
三、非一致代码段
非一致代码段:为了避免低特权级的访问而被操作系统保护起来的系统代码
非一致代码段访问限制:
1,只允许同特权级访问。
2,绝对禁止不同特权级直接访问:内核态不去用户态,用户态也不使用内核态。
3,通常低特权级代码必须通过门调用来实现对高特权级代码段的访问和调用。
一致代码段与非一致代码段,是通过段描述符的byte5的TYPE字段区分的
- S=1:该描述符描述代码段或数据段
A : 访问位,该段是否被访问过。每当处理器将该段选择子置入某个段寄存器时,就将该位置1.
W : 该数据段是否可写。
E : 扩展方向。通常来说,描述符的 [base, base + limit] 这段空间是可访问的,其它空间不可访问。如果 E = 1,[base, base +limit] 就变的不可访问,相反,其它空间变的可访问。所以 E 位,有反转有效空间的含义。
C : C = 1 表示一致代码段。后面的文章会讲解。
R : R = 1 表示该代码段可读。代码段是不可写的。