汇编的任务状态段和控制门
2007-11-13 09:31:23 来源:WEB开发网每个任务有一个任务状态段TSS,用于保存任务的有关信息,在任务内变换特权级和任务切换时,要用到这些信息。为了控制任务内发生特权级变换的转移,为了控制任务切换,一般要通过控制门进行这些转移。本文将介绍任务状态段和控制门。
<一>系统段描述符
系统段是为了实现存储管理机制所使用的一种特别的段。在80386中,有两种系统段:任务状态段TSS和局部描述符表LDT段。用于描述系统段的描述符称为系统段描述符。
1.系统段描述符的格式
系统段描述符的一般格式如下表所示。
系统段 描述符 |
m+7 | m+6 | m+5 | m+4 | m+3 | m+2 | m+1 | m+0 |
Base(31...24) | Attributes | Segment Base(23...0) | Segment Limite(15...0) |
系统段 描述符 的属性 |
Byte m+6 | Byte m+5 | ||||||||||||||
BIT7 | BIT6 | BIT5 | BIT4 | BIT3 | BIT2 | BIT1 | BIT0 | BIT7 | BIT6 | BIT5 | BIT4 | BIT3 | BIT2 | BIT1 | BIT0 | |
G | X | 0 | AVL | Limit(19...16) | P | DPL | DT0 | TYPE |
与存储段描述符相比,它们很相似,区分的标志是属性字节中的描述符类型位DT的值。DT=1表示存储段,DT=0表示系统段。系统段描述符中的段基地址和段界限字段与存储段描述符中的意义完全相同;属性中的G位、AVL位、P位和DPL字段的作用也完全相同。存储段描述符属性中的D位在系统段描述符中不使用,现用符号X表示。系统段描述符的类型字段TYPE仍是4位,其编码及表示的类型列于下表,其含义与存储段描述符的类型却完全不同。
|
|
从上表可见,只有类型编码为2、1、3、9和B的描述符才是真正的系统段描述符,它们用于描述系统段LDT和任务状态段TSS,其它类型的描述符是门描述符。利用前文定义的存储段描述符结构类型DESC仍能方便地在程序中说明系统段描述符。需要注意的是,系统段描述符的选择子不能用来读写系统段,要想读写系统段,必须使用别名技术。
2.LDT段描述符
LDT段描述符描述任务的局部描述符表段。例如:下面的描述符LDTABLE描述一个局部描述符表段,基地址是654321H,以字节为单位的界限是1FH,描述符特权级是0。
LDTABLE DESC <1FH,4321H,65H,82H,,>
LDT段描述符必须安排在全局描述符表中才有效。在装载LDTR寄存器时,描述符中的LDT段基地址和段界限等信息被装入LDT段描述符高速缓冲寄存器中。
3.任务状态段描述符
任务状态段TSS用于保存任务的各种状态信息。任务状态段描述符描述某个任务状态段TSS描述符分为286TSS和386TSS两类。TSS描述符规定了任务状态段的基地址和任务状态段的大小等信息。例如,下面的描述符TempTask描述一个可用的386任务状态段,基地址是123456H,以字节为单位的界限是104,描述符特权级是0。
TempTask DESC <104,3456H,12H,89H,,>
在装载任务状态段寄存器TR时,描述符中的段基地址和段界限等信息被装入到TR的高速缓冲寄存器中。在任务切换或执行LTR指令时,要装载TR寄存器。
TSS描述符中的类型规定:TSS要么为“忙”,要么为“可用”。如果一个任务是当前正执行的任务,或者是用TSS中的链接字段沿挂起任务链接到当前任务上的任务,那么该任务是“忙”的任务;否则该任务为“可用”任务。
利用段间转移指令JMP和段间调用指令CALL,直接通过TSS描述符或通过任务门可实现任务切换。
更多精彩
赞助商链接