task_struct:每个进程独有的结构,标识了进程的各项属性值,包括剩余时间片、进程执行状态、局部数据描述符表LDT和任务状态描述符表TSS。
task[64]和GDT是为管理多进程提供的数据结构。
task[64]中存储着系统中所有进程的task_struct指针,如果操作系统需要对多个进程加以比较并选择,可以通过遍历task[64]结构来实现。
GDT中存储着一套针对所有进程的索引结构,通过索引项,操作系统可以间接地与每个进程中的LDT和TSS建立关系。
DPL:特权级描述符
IDT:中断描述符表,位置不固定
IDTR:锁定IDT的位置
2.1设置根设备、硬盘
内核首先初始化根设备和硬盘,用bootsect中写入机器系统数据0x901FC的根设备为软盘的信息,设置软盘为根设备,并用起始自0x90080的32字节的机器系统数据的硬盘参数表设置内核中的硬盘信息drive_info。
2.2规划物理内存格局,设置缓冲区、虚拟盘、主内存
除了内核代码和数据所占内存之外,其余物理内存主要分为三部分,分别是主内存区、缓冲区和虚拟盘。主内存区是进程代码运行的空间,也包括内核管理进程的数据结构;缓冲区作为主机与外设进行数据交换的中转站;虚拟盘区是一个可选区域,如果选择使用虚拟盘,就可以将外设上的数据先复制进虚拟盘区,然后加以使用。
memory_end:系统有效内存末端位置,超过这个位置的内存部分,在操作系统中不可见。
main_memory_start:主内存区起始位置
buffer_memory_end:缓冲区末端位置
2.3设置虚拟盘空间并初始化
检查makefile文件中“虚拟盘使用标志”是否设置,以此确定本系统是否使用了虚拟盘。
假设本书所用计算机有16MB内存,有虚拟盘(2MB)。操作系统从缓冲区末端开辟2MB内存空间设置虚拟盘,主内存起始位置后移2MB至虚拟盘末端。
调用rd_init()函数,对虚拟盘进行设置。
先将虚拟盘区的请求项处理函数do_rd_request()与请求项函数控制结构blk_dev[7]的第二项挂接。blk_dev[7]的主要功能是将某一类设备与它对应的请求项处理函数挂钩。可以看出我们讨论的操作系统最多可以管理6类设备。这个挂接动作意味着以后内核能通过调用do_rd_request函数处理与虚拟盘相关的请求项操作。挂接之后,将虚拟盘所在内存区域全部初始化为0。
最后将虚拟盘区的长度值返回。这个返回值将用来重新设置主内存区的起始位置。
2.4内存管理结构mem_map初始化
对主内存区起始位置的重新确定,标志着主内存区和缓冲区的位置和大小已经全部确定了,于是系统开始调用mem_init()函数。
系统通过mem_map[]对1MB以上的内存分页进行管理,记录一个页面的使用次数。
men_init()函数先将所有内存页面使用计数均设置成USED(100,即被使用),然后再将主内存中所有页面使用计数全部清零,系统以后只把计数为0的页面视为空闲页面。
2.5异常处理类中断服务程序挂接
trap_inti()函数将中断、异常处理的服务程序与IDT进行挂接,逐步建立中断服务体系,支持内核、进程在主机中的运算。
dpl=0:只能由内核处理。
dpl=3:系统调用可以由3特权级(也就是用户特权级)调用。
2.6初始化块设备请求项结构
外设分为两类:块设备,字符设备。块设备将存储空间等分为若干大小相同的称为块的小存储空间,每个块有块号,可以独立、随机读写。硬盘、软盘都是块设备。字符设备以字符为单位进行I/O通信。
进程与块设备进行沟通,必须经过内存中的缓冲区。请求项管理结构request[32]就是操作系统管理缓冲区中的缓冲块与块设备上逻辑块之间读写关系的数据结构。
request[32]是一个由数组构成的链表;request[i].dev=-1说明了这个请求项还没有具体对应哪个设备,这个标志将来会被用来判断对应该请求项的当前设备是否空闲;request[1].next=NULL说明这时还没有形成请求项队列。
2.7与建立人机交互界面相关的外设的中断服务程序挂接
P59
2.8开机启动时间设置
P63
2.9初始化进程0
进程0是Linux操作系统运行的第一个进程,也是Linux操作系统父子进程创建机制的第一个父进程。
1)系统先初始化进程0。
2)为了支持多进程轮流执行,要求进程具备参与多进程轮询的能力。
3)进程0要具备处理系统调用的能力。
2.9.1初始化进程0
进程0的task_struct是由操作系统设计者事先写好的,就是sched.h中的INIT_TASK,并用INIT_TASK的指针初始化task[64]的0项。
sched_init()函数接下来用for循环将task[64]除进程0占用的0项外的其余63项清空,同时将GDT的TSS1、LDT1往上的所有表项清零。
初始化进程0相关管理结构的最后一步,是将TR寄存器指向TSS0、LDTR寄存器指向LDT0,这样CPU就能通过TR、LDTR寄存器找到进程0的TSS0、LDT0,也能找到一切和进程0相关的管理信息。
2.9.2设置时钟中断
2.9.3设置系统调用总入口
2.10初始化缓冲区管理结构
缓冲区是内存与外设进行数据交互的媒介。