第17章协同式任务切换

1.任务切换前的设置

要执行任务切换,系统中必须至少有2个任务
上一章中只创建了一个用户任务,本章新增了一个内核任务
创建内核任务的步骤:
(1)首先创建了一个TCB,并将它加入到TCB链表
(2)再创建了一个TSS,并登记到TCB中
(3)填写TSS
(4)创建TSS的描述符并登记到GDT
(5)将TSS描述符登记到TCB
(6)在TCB中将内核任务的状态设置为忙,即值为0xFFFF
(7)将TSS的段选择子赋值给TR。TR决定了当前运行的任务是谁,为了表明当前正在运行的是内核任务,需要把内核任务的TSS赋值给TR。这个操作会导致处理器访问位于GDT中的内核任务的TSS描述符,并将其B为设置为1,表示在忙。

2.任务切换的方法

只需要给出新任务的TSS选择子或者任务门的选择子就可以实现硬件任务切换
利用处理器执行任务切换的方法很多

2.1 第一种就是借助于中断

内存中会有一个中断描述符表IDT,它保存着各种门描述符,包括中断门、陷阱门和任务门。
任务门的主要组成部分是任务的TSS。
使借助于中断实现任务切换的过程:
(1)中断发生,根据中断号在IDT中找到任务门
(2)任务门中包含新任务的TSS的选择子,根据选择子从GDT中找到新任务的TSS
(3)将当前任务的运行状态保存到当前任务自己的TSS中
(4)将新任务的TSS中的内容恢复到各个寄存器中
(5)TR指向新任务的TSS,新任务开始执行
(6)一旦新任务开始执行,新任务的TSS描述符的B位被置1
中断发生、中断处理过程执行完毕后,需要使用iret指令返回
常规中断处理过程,返回到原任务
任务切换,返回到旧任务
程序中只给出了iret,那么是返回到原任务继续执行还是返回到旧任务,处理器怎么判断呢?
根据当前任务的EFLAGS的NT域来判断。
旧任务TSS的B位为1
新任务EFLAGS.NT位为1,TSS的B位为1,且旧任务的TSS在新任务TSS的任务链接域。
使用iret命令执行中断返回时,如果当前任务EFLAGS.NT位为1,TSS的B位为1,则返回到当前任务TSS的任务链接域指定的任务。

2.2 使用远过程调用指令call

此时call指令的操作数就是TSS描述符选择子或者任务门
使用call指令发起的任务切换是嵌套的,这点类似使用中断发起任务切换。

2.3 使用远跳转指令jmp

此时jmp指令的操作数就是TSS描述符选择子或者任务门

3.用jmp指令发起任务切换的实例

前面内核程序已经创建了一个内核任务,这里需要再创建一个用户任务。
创建一个TCB,加到TCB链中。这里会设置TCB的任务状态位,设置为就绪,即值为0.
调用load_relocate_program来加载用户程序
load_relocate_program
(1)创建LDT
(2)加载用户程序
(3)创建用户程序每个段的描述符,并且把它们安装到LDT中
(4)重定位用户程序的SALT
(5)创建0、1、2特权级的栈段描述符和选择子
(6)创建LDT描述符并安装到GDT,并将LDT的段选择子登记到TCB
(7)创建TSS
(8)填写TSS的内容
(9)创建TSS段描述符,安装到GDT,把TSS描述符选择子登记到TCB

initiate_task_switch,任务调度例程,如果哪个任务想要把执行权交给别的任务就调用这个例程
在内核代码中使用initiate_task_switch执行任务切换后,就会开始执行用户任务。
用户任务:
设置段寄存器ds和fs
显示问候语
保存当前特权级到标号cpl处
打印message_1
打印message_2
调用InitTaskSwitch发起任务切换

4.处理器在实施任务切换时的操作

5.过程

initiate_task_switch
调度策略:沿着TCB链表找到当前任务,然后继续找到第一个状态为就绪的任务,并切换到这个任务
从链头tcb_chain开始查找状态为忙的任务
寻找下一个状态为就绪的任务;如果没有找到,则回到例程调用者
如果找到了状态为就绪的任务,则,翻转当前任务和新任务的状态
使用jmp far指令实现任务的切换
Jmp far指令会从操作数中取6个字节。前4个字节是偏移地址,后2个字节是选择子。这里jmp far的操作数是TCB中偏移为0x14的地方,那里保存着TSS的基地址和选择子。jmp far [edi+0x14]
处理器在获取到了TSS的基地址和选择子之后,首先会根据选择子访问GDT,获取到描述符,得知是TSS描述符后,处理器就知道是要发起任务切换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值