权限级保护,一个任务运行在R3 ,使用与其他R3任务相同的LDT和页表,访问代码,错误的数据和其他任务的栈
使用任务管理功能来处理多任务应用程序是可选的,多任务能在软件中处理,每个软件定义的任务都执行在单IA-32架构任务的上下文中
7.2 任务管理数据结构
处理器定义了五种与任务相关的数据结构
1. 任务状态段 (TSS)
2. 任务门描述符
3. TSS描述符
4. 任务寄存器
5. EFLAGS寄存器中的NT Flag
当在保护模式的时候,在最少一个任务时,一个TSS或者TSS描述符必须被创建,并且TSS的段选择子必须被加载到TR寄存器中
7.2.1 任务状态段-TSS
任务需要恢复的处理器状态信息,保存在叫做系统段的TSS中,图片7-2显式了32位CPU下,任务的TSS格式,TSS字段主要分为两类:动态字段和静态字段
任务切换期间,当一个任务被暂停的时候,处理器会更新动态字段,下面的这些都是动态字段
1. 普通寄存器字段: EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP
2. 段寄存器字段: CS DS ES SS FS GS
3. EFLAGS寄存器
4. EIP寄存器字段
5. 上一个任务的链接字段:包含了上一个任务的TSS的段选择子(更新发生在call interrupt exception初始化造成的任务切换),这个字段(有时叫做back link字段)允许一个任务使用IRET指令返回到上一个任务
处理器读取静态字段,通常不会改变它们,这些字段是任务创建的时候设置的,下面的是静态字段
1. LDT断选择子字段:包含了任务的LDT的段选择子
2. CR3控制寄存器字段: 包含了任务使用的页表的基址,总所周知,CR3也被叫做PDBR
3. 权限级0 1 2栈指针字段:这些栈字段包含了栈段的段选择子(SS0 SS1 SS2)和栈内偏移(ESP0 ESP1 ESP2)组成的逻辑地址,对于特定任务,这些字段是静态的,如果栈切换发生在任务中,SS和ESP将会改变
4. T-FLAG(debug trap): 当设置这个flag的时候,当任务切换到这个任务的时候,T-flag会造成处理器产生一个调试异常
5. I/O位图基址字段:包含一个相对于TSS中的基址的16位偏移到I/O允许位图和中断重定向位图,当存在的时候,这些映射被存储在TSS中的较高地址,I/O映射基址指向了I/O允许位图的基址和中断重定向位图的结束
如果分页被使用:
1. 避免任务切换期间,处理器读取104个字节时,TSS存在于两个物理页(也就是页边界只有部分TSS),处理器可能执行不正确的地址翻译,任务切换期间,处理器读写每个任务的TSS的104字节(使用连续的物理地址作为TSS的第一个字节的物理地址),如果这104个字节不是物理连续的,处理器将会访问不挣钱的信息,而且也不会产生PF异常
2. 上一个任务的和这次任务的TSS的物理页,和每一个描述符表项都应该标记为可读可写
3. 在任务切换初始化的时候,如果包含这些结构的页面存在于内存中,任务切换会更快的执行
7.2.2 ?TSS描述符
TSS类似于其他的段,是被段描述符定义的,图片7-3显式了TSS描述符的格式,TSS描述符只能位于GDT中,它不能位于LDT或者IDT中
在CALL 和 JMP期间,试图用TI位为1(代表当前的LDT)的段选择子访问TSS会造成GP异常,在IRET的期间,会造成无效的TSS异常(#TS),试图加载TSS的段选择子到其他段寄存器也会造成GP异常
类型字段的Busy-Flag标志着任务是否繁忙,繁忙的任务代表正在运行或者暂停,类型字段的值如果是1001B,代表的就是一个inactive的任务,如果类型字段是1011B,那么就代表是一个繁忙的任务,任务不会递归,处理器使用Busy-FLag检测一个试图调用执行已经被中断的任务,为了确保一个Busy-Flag只与一个任务相关,每个TSS应该只有一个TSS描述符指向它
基址,段界限,DPL, G,P的功能类似于数据段描述符中的使用,在32位TSS中,如果TSS描述符的G为0,limit的值必须大于等于67h, TSS的最小size大于1