linux内核研究笔记1(linux0.11 boot部分总结)

最近花了点时间仔细阅读了linux0.11内核代码的boot部分。要看懂该部分的代码,需要事先准备如下知识点:

1.80x86体系结构基础

包括寄存器、基本指令等

2.80x86实模式

3.80x86保护模式及编程

主要理解分段机制,分页机制。需要理解几个表和结构:GDT、IDT、LDT、TSS、页目录表、页表及各自表项结构。

4.早期IBM PC机的启动过程

5.BIOS基本中断服务程序

本身boot部分的代码量不多,但是准备前面这些知识点,真的花了不少时间,尽管还是挑着看的,否则的话,估计3个月也看不完。

计算机刚开始加电的时候,cpu正常工作起来之后,处于实模式。此时,内存里面是空的,什么也没有。linux0.11内核及跟文件系统经过编译、链接、提取,做成镜像,放在了外部存储器中,其中bootsect.s最终程序镜像放在外部存储器(比如软盘)的第一个扇区(512字节)。随后的4个扇区存放setup.s。再随后的一些扇区,保存所有其它内核代码,整体叫做system镜像。

linux内核研究笔记1(linux0.11 boot部分总结)

前面bootsect和setup程序运行时,cpu还处于实模式,所以这部分工作,主要是在实模式下进行一些数据准备工作,准确来说,主要就是数据搬移和参数设置。

放在软盘第一个扇区的bootsect程序,是被BIOS自动加载到内存0x7c00处的,然后代码会把自己移动到0x90000开始的地方。随后将setup从软盘第二个扇区读入,放置在0x90200开始的地方,将system模块读入,放在0x10000开始的位置。如下:

linux内核研究笔记1(linux0.11 boot部分总结)

setup程序主要是通过BIOS中断服务器例程探测一些系统参数,放在0x90000开始的地方(bootsect将被覆盖)。然后将system移动到物理地址0开始的地方,并且设置临时的GDT和IDT表。也重新初始化8259中断控制器。然后开启PE位进入保护模式工作,jmpi到head.s代码处运行。

head.s已经是真正的保护模式了,并且代码也使用GNU as汇编格式。这里会重新设置GDT和IDT表,设置内核堆栈,检测数学协处理器,设置页目录表及页表项,设置页表及页表项,然后跳转到main.c里面的main函数运行。

所以,linux0.11 boot部分,主要是在实模式下进行一些初始设置,代码搬移,然后准备进入保护模式运行。为内核准备好段表及页表。整个过程相对来说还是比较简单,但是涉及非常底层的机器级操作,几乎没有什么软件处理技巧和算法。从后面main.c开始,继续初始化各个部分,并且会启动任务0和任务1,真正意义上进入linux的世界。

尽管不太复杂,但boot部分对于理解kernel如何启动,有十分重要的意义,建议慢下来花点时间,好好钻研一番。