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相关的管理信息。
- 2.9.1 初始化进程0
- 2.9 初始化进程0
- 初始化0号进程
- 初始化0号进程
- 初始化0号进程
- 进程初始化
- xp初始化系统进程
- 进程0 进程1
- 进程0 进程1
- 多进程的进程表初始化
- 守护进程及初始化守护进程
- 加速交换机端口初始化进程
- linux初始化进程init分析
- 进程任务结构与初始化
- 进程任务结构与初始化
- busybox的init初始化进程
- busybox的init初始化进程
- Init进程初始化安全上下文
- 复习CSS
- 基于Theano的深度学习(Deep Learning)框架Keras学习随笔-11-数据集
- 使用Spring的@Scheduled实现定时任务
- Android应用开发---面试题
- UI技巧 批量修改控件属性
- 2.9.1 初始化进程0
- CheckBox 多选按钮的使用方法
- Ruby学习-Ruby类的使用
- uft的技巧
- 从上往下打印二叉树
- 构建基于Spark的推荐引擎(python实现)
- Apache JMeter中正则表达式提取器的使用方法
- 提高单片机定时器精度的算法
- 原型模式之深浅复制