文章标题x86汇编语言从实模式到保护模式-任务切换

来源:互联网 发布:安全阀计算软件 编辑:程序博客网 时间:2024/05/19 18:47

任务切换

LTR r/m16
这条指令的操作数可以是16位通用寄存器,也可以是指向一个16位单元的内存地址,其内容都是16位的TSS选择子。
执行这条指令,将TSS选择子加载到TR寄存器之后,处理器用该选择子访问GDT中对应的TSS描述符,将段界限和段基地址加载到任务寄存器TR的描述符高速缓存器部分。同时,处理器将该TSS描述符中的B位置“1”,也就是标志位“忙”,但并不执行任务切换

真正实现任务切换可以使用远过程调用指令CALL,或者远跳转指令JMP。在这两种情况下,CALL和JMP指令的操作数是任务的TSS描述符选择子。以下是两个例子:

CALL 0x0010:0x00000000
JMP 0x0010:0x000000
用于发起任务切换,call指令和jmp指令也有不同之处。使用call指令发起的任务切换类似于因中断发起的任务切换。这就是说,由call指令发起的任务切换是嵌套的,当前任务(旧任务)TSS描述符的B位保持原来的“1”不变,EFLAGS寄存器的NT位也不发生变化;新任务TSS描述符的B位置“1”,EFLAGS寄存器的NT位也置“1”,表示此任务嵌套于其他任务中。同时,TSS任务链域的内容改为旧任务的TSS描述符选择之。
用CALL指令发起的任务切换,可以通过iret指令返回到前一个任务。此时,旧任务TSS描述符的B位,以及EFLAGS寄存器的NT位都恢复到“0”

CALL far [es:ecx+0x14]
es:ecx指向新任务的TCB,TCB内偏移为0x14的地方,是任务的TSS基地址,再往后是TSS选择子。当处理器发现得到的是一个TSS选择子,就会执行任务切换。
第一步:因为当前正在执行的任务是由任务寄存器TR指示的,把CPU中的每个寄存器的内容保存到由TR寄存器指向的TSS中

第二步:处理器用得到的TSS选择子访问GDT,取得新任务的TSS描述符,并从该TSS中恢复CPU各个寄存器的内容,将TSS描述符中的B位置“1”,EFLAGS寄存器的NT位置“1”

第三步:将新任务的TSS选择子加载到TR寄存器中。将TSS描述符加载到任务寄存器TR的描述符高速缓存器部分,处理器即将开始执行新的任务

0 0