内核源码学习:LILO的运行分析

 
 

我们知道了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 07c 00处,控制权转给Boot Loader,Boot Loader执行如下操作:

·      把自己从地址0x 07c 00 移到 0x90000。

·      利用地址0x03ff,建立“实模式”

·      建立磁盘参数表,这个表由BIOS用来处理软盘设备驱动程序。

·      通过调用BIOS的一个过程显示“Loading”信息。

·      然后,调用BIOS的一个过程从软盘装入内核映像的setup( )代码,并把这段代码放入从地址0x90200开始的地方。

·      最后再调用BIOS的一个过程。这个过程从软盘装入内核映像的其余部分,并把映像放在内存中从地址0x10000开始的地方,或者从地址0x100000开始的地方,前者叫做“低地址”的小内核映像(以“make zImage”进行的编译),后者叫做“高地址”的大内核映像(以“make bzImage”)进行的编译。

2.从硬盘启动

   一般情况下,Linux内核都是从硬盘装入的。BIOS照样将引导扇区读入至内存中的0x 00007c 00处,控制权转给Boot Loader,Boot Loader把自身移动至0x90000处,并在0x9B000处建立堆栈(从0x9B000处向0x 9A 200增长),将第二级的引导扇区读入至内存的0x9B000处,把控制权交给它。在引导扇区移动之后,将显示一个大写的L字符,而在启动第二级的引导扇区之前,将显示一个大写的I字符。如果读入第二级的引导扇区的过程有错误的话,屏幕上的LI之后会显示一个十六进制的错误号。

二级引导扇区内的代码将把描述符表读入至内存中的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 07c 00。做完这一切,它把控制权交给引导扇区。

第二级引导扇区在得到控制权以后马上显示一个大写的L字符。读入命令行解释程序后显示一个大写的O字符。

图13.11是LILO运行完后,内存的分布情况。


                    图13.11 LILO运行后的计算机内存分布情况

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值