Task State Segment,任务状态段,本质是一种用于存储任务运行环境的数据结构,是处理器在硬件上原生支持多任务的一种实现方式。任务分为用户部分和内核部分,加起来才是能让处理器完整运行的程序
TSS可唯一标识一个任务,32位系统下TSS的最小尺寸为104B,结构如下图。

处理任务时可能需要进行特权级切换,其本质是处理器的当前特权级在切换,而切换前后应该用不同的栈,否则会使栈中的数据混乱。一共四个特权级,故一个任务最多有四个栈,而TSS中只指示了三个栈,如SS0表示0级栈的段选择子,ESP0表示0级栈的偏移量,这和特权级切换有关。
段选择子的结构如下。

设想你是一个保密室的工作人员,权限为2(CPL),你想访问权限为3(DPL)的档案,就将自己的RPL修改为3,向保密室主管提出申请,他检查到
max(RPL,CPL) <= DPL,则可以访问;若你想访问权限为0的档案,则max(RPL, CPL) > DPL,不允许访问。此种访问规则只适用于被访者是数据段(数据段总是非一致的)的情形,当被访者是非一致性代码段时,即处理器在代码段之间的切换,绝大多数情况下只允许平级访问,即RPL = CPL = DPL;而只有一种情况是高特权级代码切换到低特权级代码,即中断返回时。

由实模式切换到保护模式后,CPL为0。
也称为依从代码段,用于实现低特权级的代码向高特权级代码的转移。规则为:max(CPL, RPL) >= 一致性代码段的DPL则可转移,且转移后,不会把CPL更新为一致性代码段的DPL。
这种转移本身并没有提升特权级,而只是允许执行特权级更高的代码段(并不是随意执行高特权指令),所以相对来说更安全。
门结构是一种描述符,记录着一段特殊程序的起始地址,这段程序可以实现特权级由低到高的切换。
门结构有任务门、中断门、调用门、陷阱门四种
门描述符与段描述符的区别在于:段描述符对应的是一片内存区域,而门描述符中除了任务门外,其他三种门都对应了一段特殊程序。
联系在于:任何程序都属于某个内存段,所以程序的地址需要用代码段选择子+段内偏移来描述,门描述符(除了任务门外)是基于段描述符的,任务门有点特殊,它用任务 TSS 的描述符选择子来描述一个任务。
| 位置 | 调用方式 | |
|---|---|---|
| 任务门 | GDT、LDT、IDT | call、jmp指令 |
| 调用门 | GDT、LDT | call、jmp指令 |
| 中断门 | IDT | 中断信号 |
| 陷阱门 | IDT | 中断信号 |
各种门描述符的使用如下

作用:

要使用门的功能,至少需要满足两个条件:
调用门描述符的结构如下:

call 调用门选择子指令的执行流程如下(不涉及分页机制,门描述符存在GDT中):

假设CPU目前在执行用户进程1,CPU的当前特权级CPL = 3,用户进程试图从磁盘中读数据到自己的数据段中,磁盘操作需要交由内核处理,其向调用门提供参数,其中一项是数据段的选择子
情况1:用户提供的是自己的数据段选择子,RPL为3,通过调用门后执行内核代码段,其CPL变为0,访问此DPL = 3的数据段,则操作系统检查:CPL <= DPL成立,RPL <= DPL成立,成功。
情况2:用户提供的是内核的数据段选择子,RPL为0,但通过调用门时操作系统对选择子的RPL进行修改,改为其CPL值,即为3,通过调用门后CPL = 0,此时若访试图访问DPL = 0 的内核数据段,则不满足RPL <= DPL的条件,失败。