这章讲到多任务了。多任务实际就是多个任务来回切换。切换时把上一个任务的寄存器写入内存,读入下一个任务的寄存器,保证程序能够从被中断的地方继续执行。
保存的寄存器用一个结构体表示:
struct TSS32 {
int backlink, esp0, ss0, esp1, ss1, esp2, ss2, cr3;
int eip, eflags, eax, ecx, edx, ebx, esp, ebp, esi, edi;
int es, cs, ss, ds, fs, gs;
int ldtr, iomap;
};
其中第二行都是32位寄存器,第三行都是16位寄存器。eip是程序计数器,负责记录正在运行的指令的地址。
任务切换的方式
如果JMP指令指定的目标地址不是可执行代码而是TSS,CPU就不会执行,而是理解为任务切换。
模拟两个任务的切换。首先定义两个TSS结构变量,使用set_segmdesc()将他们的地址注册到段表中。因为切换任务的时候,JMP指令就要指向这个地址。limit设置为103,因为一个TSS结构大小是104字节。
TR寄存器表示当前运行的是哪一个任务。通过LTR指令写入TSS结构所在的段号。
切换时使用JMP指令,如JMP 4*8:0
表示切换到段表中段号为4的TSS代表的任务。
任务初始化时,程序计数器应该指向