我们知道了LILO怎么安装,包含什么东西,有什么功能,但LILO到底是怎么运行的呢?下面是代码分析层次的LILO运行过程,通过介绍这个过程,希望你能对整个Boot Loader这部分内容有一个深入的认识。
1.从软盘启动
Linux内核可以存入一张1.44MB的软盘中,这样做的前提是对“Linux内核映像”进行压缩,压缩是在编译内核时进行的,而解压是由装入程序在引导时进行的。
当从软盘引导Linux时,Boot
Loader比较简单,其代码在arch/i386/boot/bootsect.S汇编语言文件中。当编译Linux内核源码时,就获得一个新的内核映像,这个汇编语言文件所产生的可执行代码就放在内核映像文件的开始处。因此,制作一个包含Linux内核的软磁盘并不是一件困难的事。
把内核映像的开始处拷贝到软盘的第一个扇区就创建了一张启动软盘。当BIOS装入软盘的第一个扇区时,实际上就是拷贝Boot Loader的代码。BIOS将Boot
Loader读入至内存中物理地址0x
· 把自己从地址0x
· 利用地址0x03ff,建立“实模式”栈。
· 建立磁盘参数表,这个表由BIOS用来处理软盘设备驱动程序。
· 通过调用BIOS的一个过程显示“Loading”信息。
· 然后,调用BIOS的一个过程从软盘装入内核映像的setup( )代码,并把这段代码放入从地址0x90200开始的地方。
· 最后再调用BIOS的一个过程。这个过程从软盘装入内核映像的其余部分,并把映像放在内存中从地址0x10000开始的地方,或者从地址0x100000开始的地方,前者叫做“低地址”的小内核映像(以“make zImage”进行的编译),后者叫做“高地址”的大内核映像(以“make
bzImage”)进行的编译。
2.从硬盘启动
一般情况下,Linux内核都是从硬盘装入的。BIOS照样将引导扇区读入至内存中的0x
二级引导扇区内的代码将把描述符表读入至内存中的0x9D200处,把包含有命令行解释程序的扇区读入至内存的0x9D600处。接着,二级引导扇区将等待用户的输入,不管这时用户输入了一个选择还是使用缺省配置,都将把对应的扇区读入至内存的0x9D600(覆盖命令行解释程序的空间),把生成的启动参数保存在0x9D800处。
如果用户定义了用于启动的RAM盘的话,这部分文件将被读入到物理内存的末尾。如果你的内存大于16MB的话,它会被读入至16MB内存的结尾,这是因为BIOS程序不支持对16MB以上内存的访问(它用于寻址的指令中只有24位的地址描述位)。并且它开始于一个新的页,以便于启动后系统把它所占的内存回收到内存池。
接下来,操作系统的初始化代码将被读入到内存的0x90200处。而系统的内核将被读入到0x10000处。如果该内核是以make bzImage方式编译的,它将被读入到内存的0x100000处。在读入的过程中,存放map文件的扇区被读入至内存的0x9D000处。
如果读入的image是Linux的内核,控制权将交给处于0x90200的Setup.S。如果读入的是另外的操作系统,过程要稍微麻烦一点:chain loader被读入到内存的0x90200处。该系统用于启动的扇区被读入到0x90400。chain loader将把它所包含的分区表移到0x00600处,把引导扇区读入到0x
第二级引导扇区在得到控制权以后马上显示一个大写的L字符。读入命令行解释程序后显示一个大写的O字符。
图13.11是LILO运行完后,内存的分布情况。
图13.11 LILO运行后的计算机内存分布情况