BIOS调用一个专门的程序,这个程序的任务就是把操作系统的内核调入内存。这个程序就叫做自举程序(Boot Loader)。在我们继续下面内容之前,先来看一下启动系统的不同途径。
1.从软盘启动Linux
从软盘启动时,存储在软盘第一扇区的指令将被加载并执行。这个指令然后就会把其余的内核复制到内存中。
Linux内核可以装在1.44MB的软盘里,不过为了减少磁盘占用量,它们都进行了压缩。这个压缩过程是在编译时完成的,而解压缩的过程则由自举程序完成。
从软盘启动Linux时,自举程序要做的工作非常简单。它是一个位于/usr/src/linux-2.4.2/arch/i386/boot/bootsect.S的汇编语言文件。当我们编译Linux内核源代码,或者获取一个新的内核时,这个可执行的汇编代码就会被放在内核程序的前端。由此可见,要制作一个可启动的Linux软盘其实很简单。我们只要从磁盘的第一个扇区拷贝Linux内核,就可以创建一个可启动软盘。当BIOS加载软盘的第一个扇区时,它实际上拷贝的是自举程序。自举程序由BIOS调用(跳到物理地址为0x00007c00的位置),然后执行以下的操作:
(1)把自已从地址0x00007c00移动到0x00090000;
(2)使用地址0x00003ff4,创建“实模式”栈;
(3)设置磁盘参数表,这里使用的是BIOS提供的软盘驱动程序;
(4)通过调用BIOS程序显示“Loading”信息;
(5)自举程序调用BIOS程序来加载软盘上内核的setup()函数,并把它放在起始地址为0x00090200的内存中;
(6)接下来自举程序调用一个BIOS程序,这个程序从软盘加载剩余的内核程序,并将其放入起始地址为0x00010000(所谓的低地址)或者0x00100000(所谓的高地址);
(7)然后,跳转到setup()函数。
2.从硬盘启动Linux
当系统从硬盘启动时,启动过程又有所不同。硬盘的第一个扇区叫做MBR(Master Boot Record),其上存储着分区表和一个小程序。这个程序加载存储由操作系统的第一扇区来开始启动。Linux是一个高度灵活且非常优秀的软件,所以在MBR里,它使用一个叫做LILO的程序来代替上述的那个程序。LILO允许用户选择所要启动的操作系统。
一般来说,Linux是从硬盘启动的。这就需要不同的自举程序。在Intel系统里,用得最多的自举程序就是LILO。对于其它的体系结构,还存在着别的自举程序。LILO可以安装在MBR上(请注意:在安装Red Hat Linux时,有一个步骤会让用户选择把LILO安装到MBR或者引导扇区)或一个活动分区的引导扇区上。
由于LILO太大,MBR无法容纳,所以它被分成两部分。MBR(或者磁盘分区的引导扇区)包含有一个小的自举程序,它被BIOS载入到起始地址为0x00007c00的内存中。然后,这个小程序再把自己移到0x0009a000地址处,接着设置实模式栈,最后加载第二部分的LILO自举程序(请注意:实模式栈地址范围是0x0009b000 到 0x0009a200)。
第二部分的LILO会从磁盘读取所有可用的操作系统,并且给用户列出,以选择所要启动的系统。一旦用户选择完成,自举程序就会加载相应的扇区内容到内存中并且执行之。
自举程序被BIOS调用时(跳到物理地址为0x00007c00处),要执行以下操作:
(1)把自已从地址0x00007c00移动到0x00090000;
(2)使用地址0x00003ff4,创建“实模式”栈;
(3)设置磁盘参数表。这里使用的是BIOS提供的软盘驱动程序;
(4)通过调用BIOS程序显示“Loading Linux”信息;
(5)自举程序调用BIOS程序来加载软盘上内核的setup()函数,并把它放在起始地址为0x00090200的内存中;
(6)接下来自举程序调用一个BIOS程序,这个程序从软盘加载剩余的内核程序,并将其放入起始地址为0x00010000或者0x00100000;
(7)然后,跳转到setup()函数。