多任务的本质是利用定时器和far跳转在任务之间进行切换,具体来说,一开始先运行main函数(就是处理我们的鼠标、键盘和定时器等事件),0.02s后定时器超时,执行如下语句:
far-JMP指令指向的目标地址段是4*8,这是任务B的TSS所在,因此实际上是发生了任务切换,下面是任务B的TSS设定:
之后任务B得到执行,下面是任务B的函数:
farjmp(0, 4 * 8);
这是一个far跳转,先看一下farjmp的实现:
_farjmp: ; void farjmp(int eip, int cs)
JMP FAR [ESP+4] ; eip, cs
RET
far-JMP指令指向的目标地址段是4*8,这是任务B的TSS所在,因此实际上是发生了任务切换,下面是任务B的TSS设定:
set_segmdesc(gdt + 4, 103, (int) &tss_b, AR_TSS32);
之后任务B得到执行,下面是任务B的函数:
void task_b_main(struct SHEET *sht_back)
{
//for (;;) { io_hlt(); }
struct FIFO32 fifo;
struct TIMER *timer_ts, *timer_put;
int i, fifobuf[128], count = 0;
char s[11];
fifo32_init(&fifo, 128, fifobuf);
timer_ts = timer_alloc();
timer_init(timer_ts, &fifo, 2);