1.TSS介绍
在一个多任务环境中,当发生了任务切换,需保护现场,因此每个任务的应当用一个额外的内存区域保存相关信息,即任务状态段(TSS);TSS格式固定,104个字节,处理器固件能识别TSS中元素,并在任务切换时读取其中信息。
2.GDT、TSS、LDT对比
GDT/LDT/TSS | 对比 | 内容 | |
---|---|---|---|
GDT(全局描述符表) | 整个系统只有一个GDT; 通过全局描述符寄存器GDTR进行定位; | 段描述符 | |
LDT(局部描述符表) | 每个任务都配有一个LDT,LDT基地址、界限等信息存放在任务对应的TCB中; 通过局部描述符寄存器GDTR进行定位; 将LDT视为一种特殊的内存段,则可为每一个LDT创建一个LDT描述符,将描述符存放到GDT中; 访问LDT时:GDT选择子==>访问GDT==>LDT描述符==>访问LDT(==>加载到LDTR); | 段描述符 | |
TSS(任务状态段) | 每个任务都配有一个TSS,TSS基地址、界限等信息可以存放在任务对应的TCB中; 通过任务寄存器TR进行定位; 将TSS视为一种特殊的内存段,则可为每一个TSS创建一个TSS描述符,将描述符存放到GDT中; 访问TSS时:GDT选择子==>访问GDT==>TSS描述符==>访问TSS(==>加载到TR); | 保存任务相关信息 |
各部分关系图:

3.任务寄存器TR与局部描述符表寄存器LDTR
TR,LDTR总指向当前任务的TSS,LDT。

TR(LDTR)寄存器包含16位TR(LDTR)描述符选择子+描述符高速缓存器;
加载TR和LDT分别使用指令ltr和lldt:
//操作数可以为16位通用寄存器或16位单元内存地址,不论寄存器还是内存单元,内容为16位TSS(LDT)选择子
ltr r/m16
lldt r/m16
将TSS(LDT)选择子加载到TR(LDTR)后,CPU访问GDT==>得到TSS(LDT)描述符==>将段界限、基址加载到TR(LDTR)高速缓存部分;若为TSS则TSS中’B’置1即忙;
3.TSS描述符格式
TSS描述符存放在GDT中;

4.LDT描述符格式
LDT描述符存放在GDT中,在GDT中的选择子可以存入相应的TCB中;

段界限指示LDT的范围;
S-TYPE固定为'0-0010',表明为LDT描述符;
5.TSS结构

组成 | 作用 | |
---|---|---|
0:任务链接域 | 前一个任务的TSS描述符的GDT选择子 | |
SS0,SS1,SS2 ESP0,ESP1,ESP2 | 分别是0,1,2特权级的栈段选择子和对应栈段的栈顶指针; 该部分应由任务创建者填写,且属于一般不变的静态部分,用于当通过门进行特权级转移时切换的栈 | |
28:CR3 | 分页相关 | |
32~92部分 | 处理器各寄存器快照,用于任务切换时,保存状态以便将来恢复现场; 多任务环境中,每创建一个任务,OS至少要填写EIP,EFLAGS,ESP,CS,SS,DS,ES,FS,GS,当该任务第一次执行时,处理器从这加载初试环境,并从CS:EIP处开始执行,从此运行期间由固件更改; | |
96:LDT段选择子 | 即当前任务的LDT描述符的GDT选择子; | |
100:T | 用于软件调试,在多任务环境中,若为1,每次切换到该任务引发一次调试异常中断; | |
I/0映射起始地址 | 用于决定当前任务是否可以访问特定硬件端口,填TSS段界限(103)即代表不用; |