30天自制操作系统day15

这章讲到多任务了。多任务实际就是多个任务来回切换。切换时把上一个任务的寄存器写入内存,读入下一个任务的寄存器,保证程序能够从被中断的地方继续执行。
保存的寄存器用一个结构体表示:

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代表的任务。
任务初始化时,程序计数器应该指向

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值