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代表的任务。
任务初始化时,程序计数器应该指向这段程序的开头。所以在初始化TSS时,把task_main()的地址赋给eip。另外还要分配一个栈空间。不同的任务栈必须不同,这里用memman_alloc_4k()分配了一段内存空间作为栈。
利用之前学的定时器,可以实现定时切换任务。如何在任务之间传递参数?这里可以使用刚才分配栈空间的esp,把参数放在esp+4的位置,就可以从task_main()中得到参数了。

真正的多任务

以上只是简单的任务切换。如果要实现真正的多任务,切换不应该出现在程序里面。可以在中断处理函数中进行任务切换。
在主程序(第一个任务)中初始化一个定时器,在inthandler20()中,当这个定时器timeout时,执行mt_taskswitch()。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值