进程不外乎4个要素:进程表、进程体、GDT、 TSS。
仿照进程A初始化,我们当然可以将这份代码复制一份,将其中涉及进程A的内容统统改成与进程B相关的代码。可是显然那样有些蹩脚,因为我们不可能每增加一个进程就复制一份代码,最好我们能够让代码在某种程度上实现一点自动化,让增加一个进程变得简单而迅速。 定义一个数组,循环遍历即可。一个进程只要有一个进程体和堆栈就可以运行了。
进程表很简单就是初始化一个数组,了解每个字段的意义即可。
一个进程如何由 “睡眠”状态变成 “运行”状态?无非是将esp指向进程表项的开始处,然后在执行lldt之后经历 一系列pop指令恢复各个寄存器的值。一切信息都包含在进程表中,所以,要想恢复不同的进程,只需要将esp指向不同的进程表就可以了。
时钟中断调用的C语言程序编写的进程调度函数,进程表是一个数组,存储了所有进程的状态,仅仅修改全局变量p_proc_ready指向数组的不同下标,就可以完成进程切换。
PUBLIC void clock_handler(int irq)
{
disp_str("#");
p_proc_ready++;
if (p_proc_ready >= proc_table + NR_TASKS)
p_proc_ready = proc_table;
}