17 进程调度初始化sched init:多进程的基石
你好,我是闪客。
在上一讲中,我们讲到,time_init 方法通过与 CMOS 端口进行读写交互,获取到了年月日时分秒等数据,并通过这些计算出了开机时间 startup_time 变量,是从 1970 年 1 月 1 日 0 时起到开机当时经过的秒数。
我们继续往下看,大名鼎鼎的进程调度初始化,shed_init。
这方法可了不起,因为它就是多进程的基石!
终于来到了兴奋的时刻,是不是很激动?不过先别激动,这里只是进程调度的初始化,也就是为进程调度所需要用到的数据结构做个准备,真正的进程调度还需要调度算法、时钟中断等机制的配合。
当然,对于理解操作系统,流程和数据结构最为重要了,而这一段作为整个流程的起点,以及建立数据结构的地方,就显得格外重要了。
TSS和LDT
我们进入这个方法,一点点往后看。
// kernel/sched.c
void sched_init(void) {
set_tss_desc(gdt+4, &(init_task.task.tss));
set_ldt_desc(gdt+5, &(init_task.task.ldt));
...
}
两行代码初始化了下 TSS 和 LDT。
先别急问这俩结构是啥。还记得之前讲的全局描述符表 gdt 么?它在内存的这个位置,并且被设置成了这个样子。

忘了的看一下第8讲 重新设置 idt 和 gdt,这就说明之前看似没用的细节有多重要了,你一定要有耐心。
说回这两行代码,其实就是往后又加了两项,分别是 TSS 和 LDT。