任务切换
在这这节,我将讲解怎样实现任务之间的转换。下面这段代码有三个任务,分别是临时任务,任务A,任务B。任务之间的转换需要使用任务门attaskgate,任务门是门的一种,任务门的的选择子必须是指向GDT中的任务状态段TSS描述符。任务的入口保存在TSS中。利用段间转移指令JMP和段间调用指令CALL,任务门可以实现任务切换。
例如任务门tob descriptor <0,tssb_sel,0,attaskgat+dpl2,0>任务的入口是任务状态段tssbseg的描述符tssb_sel.
每个任务都有自己的任务段TSS,当任务实现转换的时候。当前任务的寄存器值和其他相关信息都会保存到自己对应的任务段中,然后从将要运行的任务的任务段中读出数据,用来初始化寄存器。所以你将会在代码中看到mov ax,tss0_sel,ltr ax这两条语句。这两个指令是把临时任务的寄存器等相关信息保存到tss0seg中,jump tssa_sel,0这个指令实现了任务切换。当计算机运行这个指令,计算机会从任务段tssaseg中读取数据,然后放置对应的寄存器中。这样就实现了从临时任务到任务A的切换了。
当指令运行到jump tob_sel,0,任务门内的选择子tssb_sel指示任务B的TSS,并且此时的任务B的TSS是可用的,所以可以顺利进行任务切换。任务A的现场保存到任务A的TSS段,任务B的现场保存从任务B的TSS恢复。
最后任务B通过调用门torealm返回到临时任务,然后切换到实模式。
具体的代码请看http://ywchen2000.51.net/NEW.HTM
最后感谢CSDN汇编板块的csdsjkk() 指点.
参考资料:杨季文主编的<<80X86汇编语言程序设计教材>>