2.9.1 初始化进程0

来源:互联网 发布:js形参实参如何理解 编辑:程序博客网 时间:2024/06/01 08:01

2.9.1 初始化进程0

sched_init函数比较难理解的是下面两行:

set_tss_desc(gdt?+?FIRST_TSS_ENTRY,&(init_task.task.tss));

set_ldt_desc(gdt?+?FIRST_LDT_ENTRY,&(init_task.task.ldt));

这两行代码的目的就是要像图2-17表现的那样在GDT中初始化进程0所占的4、5两项,即初始化TSS0和LDT0。

另外,要拼出图2-18所示的结构。我们以TSS0为例,参看源代码中的注释,可以绘出图2-19。LDT0类似。

对比源代码、注释和图,可以看出,movw $104,%1是将104赋给了段限长15:0的部分;粒度G为0,说明限长就是104字节,而TSS除去struct i387_struct i387后长度正好是104字节。LDT是3×8?=24字节,所以104字节限长够用。TSS的类型是0x89,即二进制的10001001,可以看出movb $" type ",%4在给type赋值1001的同时,顺便将P、DPL、S字段都赋值好了。同理,movb $0x00,%5在给段限长19:16部分赋值0000的同时,顺便将G、D/B、保留、AVL字段都赋值好了。

进程0的task_struct是由操作系统设计者事先写好的,就是sched.h中的INIT_TASK(参看上面相关源代码和注释,其结构示意见图2-20),并用INIT_TASK的指针初始化task[64]的0项。

sched_init()函数接下来用for循环将task[64]除进程0占用的0项外的其余63项清空,同时将GDT的TSS1、LDT1往上的所有表项清零,效果如图2-21所示。

 

初始化进程0相关的管理结构的最后一步是非常重要的一步,是将TR寄存器指向TSS0、LDTR寄存器指向LDT0,这样,CPU就能通过TR、LDTR寄存器找到进程0的TSS0、LDT0,也能找到一切和进程0相关的管理信息。

0 0
原创粉丝点击