这一部分应该是最重要的,也是最难理解的!
首先要明白,在源代码中,内核的启动是从head.S(arc/i386/boot/head.S)一直到main.c(init/main.c)中的start_kernel(),这一路,可谓历尽坎坷啊!
呵呵,先不要被吓坏了,慢慢来吧!我第一个任务就是把这一路东东,弄明白!
还是要明白一点,在这一节中,如果很多东东,看不明白时,我们应该想到,操作系统的基地还是硬件,是否由于硬件设计上的固化呢!在有些时候,应当这样去想,如果不是这样的话,再考虑分析软件源码部分,不过,前面还是有一段介绍性的初始化过程,因为linux程序在这一部分是无法左右的.
一. 内核初始化及启动过程.
计算机刚开始启动时,是与Linux无关的.也就是开机的过程,不过,这一部分也有必要说一下,不然,总觉得,一路不够透明.
当PC 机加电开始启动时,80X86的处理器(CPU)在实模式下自检,开始执行物理地址0xFFFF0即ROM-BIOS的起始地址处的代码。PC机的 BIOS进行系统自检,初始化中断向量表到物理地址0x0。然后把引导设备的第一个扇区加载到地址0x7C00,执行此处的指令。到这里与linux无关,x86系列的硬件设置如此.
因为32位Intel处理器在加电,reset或init后,控制寄存器CR0初值为0x60000010H,由此对应处理器是在实模式下,分页机制没有启动(PE=0,PG=0),因此,处理器所使用的地址和操作数的长度为16位;代码段寄存器的初值为0xF000H,指令寄存器EIP的初值为 0xFFF0H(这两个值也是由Intel处理器的体系结构定的,所以下面说的0xFFFF0H的道理也就在这里了。)于是开机过程如下:
1。机器加电,处理器完成自检和初始化,设置各寄存器的初值,而后开始执行指令。
2。处理器执行的第一条指令的地址是CS*16+IP,即0xFFFF0H,而该地址离实模式下处理器的最大可编地址0xFFFFFH仅16字节,是驻留在ROM中的BIOS的入口地址,处理器从此处开始执行指令,因此,最先获得机器控制权的是BIOS。(明白了,为什么BIOS最先被加载,也许你会问我:BIOS的入口地址如何让内存知道的,也就是BIOS的入口地址如何加载到内存中去的,这要去看看微机原理中所说的内存地址空间的知识了.)
3。BIOS完成对整个机器系统的检测,并将有关系统配置的基本信息记录在内存的BIOS的数据区中,然后,从引导盘(软盘,硬盘,光驱等)上将一个引导扇区(如软盘的0道0扇区)读入到内存的0x7C00H处,最后转到0x7C00H处,将对机器的控制权交给操作系统.(问题:引导扇区为什么会被读到内存0x7C00H这个地址处呢?这个地方是个约定!) (看代码时,也许有些问题,我可能一时回答不上,不过,这不影响往下看,随着阅读的深入,一定会有所收获的!呵呵,鼓励自己两句。)
4。好了,看到这里,操作系统开始上场。
linux开始运行,它把自己装入到绝对地址0X90000处,并把其后的2K字节装入到地址0X90200处。(注:这个地方有两个阶段:一个是引导(请看这:bootsect.s),一个实模式下(这里暂不解析,不影响阅读)的初始化过程(Setup.s))setup.s程序从0X90200处开始存放。该程序的开始部分(从0X90200到0X90266)是一些系统参数,它们与位于从0X90000到0X90200之间的引导参数一起构成整个操作系统的初始参数区。这些参数大部分是在系统引导映像创建时由映像创建程序写入的,也有部分是由Setup程序测试系统后记录下来的。这部分数据是操作系统接受的第一批参数,它们将影响整个系统的运行过程。
接下来干什么呢?建议看一下setup.s源代码。
首先要明白,在源代码中,内核的启动是从head.S(arc/i386/boot/head.S)一直到main.c(init/main.c)中的start_kernel(),这一路,可谓历尽坎坷啊!
呵呵,先不要被吓坏了,慢慢来吧!我第一个任务就是把这一路东东,弄明白!
还是要明白一点,在这一节中,如果很多东东,看不明白时,我们应该想到,操作系统的基地还是硬件,是否由于硬件设计上的固化呢!在有些时候,应当这样去想,如果不是这样的话,再考虑分析软件源码部分,不过,前面还是有一段介绍性的初始化过程,因为linux程序在这一部分是无法左右的.
一. 内核初始化及启动过程.
计算机刚开始启动时,是与Linux无关的.也就是开机的过程,不过,这一部分也有必要说一下,不然,总觉得,一路不够透明.
当PC 机加电开始启动时,80X86的处理器(CPU)在实模式下自检,开始执行物理地址0xFFFF0即ROM-BIOS的起始地址处的代码。PC机的 BIOS进行系统自检,初始化中断向量表到物理地址0x0。然后把引导设备的第一个扇区加载到地址0x7C00,执行此处的指令。到这里与linux无关,x86系列的硬件设置如此.
因为32位Intel处理器在加电,reset或init后,控制寄存器CR0初值为0x60000010H,由此对应处理器是在实模式下,分页机制没有启动(PE=0,PG=0),因此,处理器所使用的地址和操作数的长度为16位;代码段寄存器的初值为0xF000H,指令寄存器EIP的初值为 0xFFF0H(这两个值也是由Intel处理器的体系结构定的,所以下面说的0xFFFF0H的道理也就在这里了。)于是开机过程如下:
1。机器加电,处理器完成自检和初始化,设置各寄存器的初值,而后开始执行指令。
2。处理器执行的第一条指令的地址是CS*16+IP,即0xFFFF0H,而该地址离实模式下处理器的最大可编地址0xFFFFFH仅16字节,是驻留在ROM中的BIOS的入口地址,处理器从此处开始执行指令,因此,最先获得机器控制权的是BIOS。(明白了,为什么BIOS最先被加载,也许你会问我:BIOS的入口地址如何让内存知道的,也就是BIOS的入口地址如何加载到内存中去的,这要去看看微机原理中所说的内存地址空间的知识了.)
3。BIOS完成对整个机器系统的检测,并将有关系统配置的基本信息记录在内存的BIOS的数据区中,然后,从引导盘(软盘,硬盘,光驱等)上将一个引导扇区(如软盘的0道0扇区)读入到内存的0x7C00H处,最后转到0x7C00H处,将对机器的控制权交给操作系统.(问题:引导扇区为什么会被读到内存0x7C00H这个地址处呢?这个地方是个约定!) (看代码时,也许有些问题,我可能一时回答不上,不过,这不影响往下看,随着阅读的深入,一定会有所收获的!呵呵,鼓励自己两句。)
4。好了,看到这里,操作系统开始上场。
linux开始运行,它把自己装入到绝对地址0X90000处,并把其后的2K字节装入到地址0X90200处。(注:这个地方有两个阶段:一个是引导(请看这:bootsect.s),一个实模式下(这里暂不解析,不影响阅读)的初始化过程(Setup.s))setup.s程序从0X90200处开始存放。该程序的开始部分(从0X90200到0X90266)是一些系统参数,它们与位于从0X90000到0X90200之间的引导参数一起构成整个操作系统的初始参数区。这些参数大部分是在系统引导映像创建时由映像创建程序写入的,也有部分是由Setup程序测试系统后记录下来的。这部分数据是操作系统接受的第一批参数,它们将影响整个系统的运行过程。
接下来干什么呢?建议看一下setup.s源代码。