(Linux 0.11) Draft 6 IA32架构下多任务的硬件支持
[ ]The content is recoverd from Wordpress Blog, for more details please check HERE
April 8, 2017
Overview The content is recoverd from Wordpress Blog, for more details please check HERE
支持多任务的硬件结构为 Task Register (TR) Task State Segment (TSS), LDT 以及 Task Gate。而最核心的,存储任务上下文信息的就是 Task State Segment, 下面对其进行详细的说明
TSS基本数据结构
- GDT, LDT
- TSS(Task State Segment) has its own descriptor called TSS Descriptor
- Structure of 32 bit TSS, store the context and link to previous task, and 3 different privileged Stack
下面对一些比较关键的部分进行介绍
- Previous Task Link: 存储的是上一个任务的选择符
- LDT Segment Selector: 存储的是这个Task使用的LDT
- I/O Map Base Address: I/O Map的基地址(要对 I/O Map 是什么进行进一步的解读: I/O Map 包含一个权限Map和一个Interrupt redirect Map)
TSS 描述符的一些说明
- TSS Descriptor 用于描述 Task State Segment 的描述符,当选择符的TI Flag被置位的时候(即指向当前LDT)不可以访问TSS, 这种情况下,使用 CALL, JMP 会引发GP#, 使用IRET 会引发#TS(Invalid TSS Exception), TSS Descriptor只能被放在 GDT 中,不可以放在 LDT IDT 中
- 下面是TSS描述符的结构
Type 有两种 1001 1011, 前者表示该TSSD对应的Task处于 inactive 状态下,后者表示该 TSSD 对应的Task正处于Busy状态下
- 每一个Task只能有一个TSS Descriptor对应
- Task Gate Descriptor 做切换的时候不需要检查 CPL
任务切换过程
任务切换发生在下面几种情况下:
- 当前运行的任务 JMP / CALL 了GDT中的一个TSS , 当 CALL / JMP 以 FAR 模式被调用的时候,如果 Segement Selector 指向的选择符是一个 TSSD, 那么就会发生 Task Switch, 忽略掉 CALL / JMP 的 offset。
- 同样的,如果调用 JMP / CALL 而且 Selector 为 GDT / LDT 中的一个 Task Gate Descriptor(任务门描述符)也会发生 Task Switch
- 发生中断/异常,且中断向量指向一个Task Gate Descriptor
- IRET 指令被调用且 EFLAGS 寄存器的 NT Flag 被置位
任务切换过程比较繁琐,这里简单说明其过程
- 获取 TSS 的 Segment Selector, 如果是 JMP / CALL 则是直接给出的, 或者是通过中断指向的 Task Gate Descriptor 给出,如果是 IRET 指令,则查看当前 TSS 的 Previous Task Link (见上图 TSS结构图)获得 Selector
- 检查特权级别, 如果是 CALL / JMP 则需要检查特权级别,中断 和 IRET 不需要检查, INT n 指令引发的中断调用,会检查特权级别
- 检查 TSS 的合法性,以及其他必要检查
- 清除或者设置相应的标志位
- 将当前(old)任务状态保存到当前的TSS内,
- 如果任务切换不是因为 IRET 引起的,则将新任务的 TSSD 的 Busy 位置位
- 装载新的 Task Descriptor(Selector) 到 Task Register
- 将新的 Task State Segment(TSS) 中的上下文装入通用寄存器,段寄存器, EIP EFLAGS 等寄存器(见上图 TSS结构)
- 上下文(context)已经设置好了,开始执行新的任务(此时的EIP, CS等 寄存器已经是该TSS中给定的寄存器了,之前的任务完全转移走了)
下一篇文章会对Linux0.11中如何实现任务切换进行介绍
Historical Comments
Post navigation ————— NEXT
i3 + conky 打造实用美观的桌面环境 =w= PREVIOUS [Linux 0.11] Draft 5 虚拟内存管理(mm/memory.c)