Linux内核设计艺术笔记(二)

从开机加电到执行main函数期间,实现了内核程序到计算机内存的加载,从实模式到保护模式的转变,并且开始重建保护模式下的中断服务机制,内存分页机制等前期工作,然后开始顺理成章地调用并执行main函数。此时,系统仍处于中断关闭模式

二、设备环境初始化及激活进程0

现在开始进入main函数中执行,此时,内核程序需要对设备环境进行初始化工作,同时,需要激活系统的第一个进程----进程0

相关初始化工作流程如下:

(1) 设置根设备、硬盘;(略)

(2) 规划物理内存格局,设置缓冲区、虚拟盘、主内存;

       主机中的运算需要CPU、内存相互配合工作才能实现。对内存中缓冲区、主内存的设置、规划从根本上决定了所有进程使用内存的数量和方式,必然会影响到进程在主机中的运算速度。具体规划:

       除内核代码和数据所占的内存空间之外,其余物理内存主要分三部分,分别是主内存区、缓冲区和虚拟盘。主内存区是进程代码运行的空间,也包括内核管理进程的数据结构;缓冲区主要作为主机与外设进行数据交互的中转站;虚拟盘区为可选区域,如果使用虚拟区,则可以将外设上数据先复制到虚拟区,然后加以使用。

(3) 设置虚拟盘空间并初始化;(略)

(4) 内存管理结构mem_map初始化;

       主内存区与缓冲区的位置及大小确定后,系统就开始对主内存区的管理结构进行设置。这里值得注意的是,操作系统设计者对内核和用户进程采用了两套不同的内崔分页管理方法。内核采用的分页管理方法,线性地址和物理地址完全一样,一一映射,等价于内核可以直接获得物理地址;用户进程则不是这样,它的线性地址与物理地址往往通过mmap映射,之间没有可递推的逻辑关系。这样设置的目的在于,让用户进程无法通过线性地址推算出具体的物理地址,但是内核可以。于是,内核可以访问用户进程,而用户进程只能知道自己的进程空间,所以就不能访问其他的用户进程,更不能访问内核。

(5) 异常处理类中断服务程序挂接;(略)

(6) 初始化块设备请求项结构;(略)

(7) 与建立人机交互界面相关的外设的中断服务程序挂接;(略)

(8) 开机启动时间设置;(略)

(9) 初始化进程0;

       进程0是Linux操作系统中运行的第一个进程,也是Linux操作系统父子进程创建机制的第一个父进程,因此,进程0须具备以下三种能力:

       1) 将进程0的task_struct结构中LDT、TSS与GDT挂接,并对GDT、程调度相关的寄存器等作初始化设置;

       2) 具备参与多进程轮询能力,即支持多进程轮流执行(系统在这里对时钟中断进行设置);

       3) 具备处理系统调用的能力,通过set_system_gate将system_call与IDT相挂接;

       首先,进程0的task_struct是由操作系统设计者事先设计好的,即INIT_TASK宏,并用其指针初始化task[0]项,将其余项清零操作。初始化进程0的最后一步,将LDTR与TR寄存器分别指向LDT0、TSS0,CPU即能够获得一切与进程0相关的管理信息;然后,设置时钟中断,挂接时钟中断服务程序,再将打开与时钟中断相关的屏蔽码;最后,设置系统调用总入口,所有用户程序使用系统调用,产生软中断后,操作系统均通过此入口找到具体的系统调用函数。

(10) 初始化缓冲区管理结构;

       缓冲区是内存与外设进行数据交互的媒介。内存与硬盘最大的区别在于,硬盘仅仅是对数据信息以很低的成本做大量数据的端点存储,不参与运算;而内存除了需要对数据进行存储之外,更重要的是要与CPU、总线配合进行数据运算。缓冲区介于两者之间,它既对数据信息进行保存,也能够参与一些像查找、组织之类的间接、辅助性运算。也因为有了缓冲区,硬盘与内存均只需考虑与缓冲区进行数据交互,两者的组织、管理与协调由操作系统统一操作。

       操作系统通过hash_table[NR_HASH]、buffer_head双向循环链表组成的复杂哈希表管理缓冲区。每一个buffer_head对应一块缓冲块,结构示意图如下:

                                                        

(11) 初始化软、硬盘;(略)

(12) 开启中断;

       到这一步,系统中所有中断服务程序都已经和IDT正常挂接,即意味着中断服务体系构建完毕,系统可以在32位保护模式下处理中断,重要意义之一是可使用系统调用。 

(13) 翻转特权级,成为真正的进程;

          Linux操作系统规定,除进程0外,所有进程都要由一个已有进程在3特权级下创建。而以上所有的流程操作,进程0的代码和数据都是由操作系统设计者写在内核代码、数据区,并且处于0特权级,此时,进程0还不是严格意义上的进程。因此,进程0需要转变特权级,这里是通过模仿中断返回动作的方法。CPU从接收到中断请求,到从中断服务程序返回期间,做了两件事:

       1) 硬件保护现场和恢复现场; 2) 翻转特权级;

       这里,模仿中断和笔记(一)中跳转main函数的方式一样,由程序员事先模仿压栈顺序手工进行压栈,并出栈。

至此,进程0正式激活,成为名副其实的进程,并开始创建进程1。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值