操作系统学习(五) 、代码段和数据段描述符
一、代码段和数据段描述符格式
-
段描述符通用格式如下所示:
-
代码段和数据段描述符中各个位的含义如下所示:
二、代码段和数据段描述符类型
当段描述符中S标志位(描述符类型)被置位,则该描述符用于代码段或数据段。此时类型字段中最高比特位(第二个双字的位11)用于确定是数据段描述符(复位)还是代码段描述符(置位)。
-
代码段和数据段描述符类型如下所示:
-
对于数据段描述符,类型字段的低3位(位8,9,10)分别用于表示已访问A,可写W,和扩展方向E,根据可写比特位W的设置,一个数据段可以是只读的,也可以是可读可写的。
-
已访问比特位指明从上次操作系统复位该位之后一个段是否被访问过。每当处理器把一个段的段选择符加载进段寄存器,它就会设置该位。该位需要明确地清除,否则一直保持置位状态,该位可用于虚拟内存管理和调试。
-
堆栈段必须是可读可写的数据段,若使用不可写的数据段的段选择符加载到SS寄存器,将导致一个一般保护异常。如果堆栈段的长度需要动态地改变,那么堆栈段可以是一个向下扩展的数据段(扩展标志位置位)。动态地该百年段限长将导致栈空间被添加到栈底部。
-
对一代码段,类型字段的第三位被解释成已访问A,可读R,和一致的C。根据可读R标志的设置,代码段可以是只能执行、可执行/可读。当常数或其它静态数据以及指令码被放在了一个ROM中就可以使用一个可执行/可读代码段,这里,通过使用带CS前缀的指令或者把代码段选择符加载进一个数据段寄存器(DS,ES,FS或GS),我们可以读取代码段中的数据,在保护模式下,代码段是不可写的。
-
代码段可以是一致性的或非一致性的。向更高特权级一致性代码段的执行控制转移,允许程序以当前特权级继续运行,向一个不同特权级的非一致性代码段的转移导致一般保护异常,除非使用了一个调用门或任务门。不访问保护设施的系统工具以及某些异常类型的处理过程可以放在一致性代码段中。需要防止低特权级程序或过程访问的工具应该存放在非一致性代码段中。
-
所有的数据段都是非一致性的,即意味着它们不能被低特权级的程序或过程访问,与代码段不同,数据段可以被更高特权级的程序或过程访问,而无需使用特殊的访问门。
如果GDT或LDT中一个段描述符被存放在ROM中,那么若软件或处理器试图更新在ROM中的段描述符时,处理器就会进入一个无限循环(why?),为了防止这个问题,需要存放在ROM中的所有描述符的已访问位应该预先设置成置位状态,同时,删除操作系统中任何试图修改ROM中段描述符的代码。