30天自制操作系统day15

来源:互联网 发布:excel数据有效性颜色 编辑:程序博客网 时间:2024/05/22 06:05

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

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 0
原创粉丝点击