系统引导与初始化(1)——概述

系统引导与初始化

 

操作系统(内核)的映像存储在某种不挥发的介质中,

在开机加电时从一个不挥发的介质装入操作系统、并转入运行的映像过程,这个过程称为“引导”(bootstrap,或boot),也称为“自举”。

此处的不挥发介质通常是:硬磁盘或软盘,也可以是EPROM或Flash存储器,还可以是网络中别的节点。

 

对于从EPROM或Flash存储器中装入映像是很简单的。因为其本身就是内存的一部分,访问这些存储器与访问普通的内存空间并无不同。

相比之下,对于从磁盘等外部设备装入操作系统映像就复杂很多。

 

一般所说的“引导”,都是指从磁盘上引导。其中从硬盘引导,是最为典型的。

 

PC一开机后,CPU就能执行一段程序,这段程序本身必须存储在作为系统内存一部分的EPROM、Flash等不挥发存储器中。同时必须知道怎样才能从不挥发介质装入操作系统的映像。

 

实际上,各种CPU都设计成一加电后就从某个特殊的地址开始执行指令,所以这些不挥发存储器就放在这个位置上。例如,i386 CPU加电或Reset后CPU处于实地址模式,同时代码段寄存器CS的内容为0xffff,而取地址指针(寄存器)IP的内容则为0;也即从线性地址0xffff0开始取第一条指令。所以采用i386 CPU的系统在这个位置必须有不挥发存储器。

对于这段程序的大小,在早期计算机中,这段程序一般都很小,例如2KB或更小。这是因为早期的EPROM或PROM的容量都很小,并且其目的和功能也很单一。那么该段程序是如何把操作系统的映像从磁盘读入的呢?

此处把操作系统映像的读入作为一个特例处理。在设备驱动的底层解决问题。在磁盘的某个固定位置存放关于操作系统映像的“地理”信息,同时还在这个固定的位置上存放一段适用于具体操作系统的可执行程序做为补充。也就是要通过磁盘上的某个固定位置,通常是一个扇区,提供一个“对象”,其中既保罗了数据,也包括了运用这些数据的程序。这个扇区称为“引导扇区”,通常都是磁盘上的第一个扇区。

 

而EPROM中的程序,则因为其作用在于从磁盘读入引导扇区,因而常常称为初始引导程序。初始引导程序是“中性”的,与具体操作系统或文件格式无关,它只是从磁盘上读入引导扇区,然后把引导扇区的开头作为一段程序的起点,使CPU转入这段程序,引导扇区的内容取决于具体的操作系统,也可能还进一步取决于文件格式。

然而,由于引导扇区只是一个扇区,只有512字节,能够容纳的信息和代码是很有限的。所以常常还得要由引导扇区的程序先装入其他若干扇区,再由这些扇区中的程序和数据协同完成整个引导过程。

 

有时也可以先通过引导扇区读入一个作为中间步骤的工具性程序(而不是操作系统映像),常称为“引导装入程序”,再由引导装入程序装入操作系统映像。对于Linux来说,LILO就是其引导装入程序。

从概念上来说,引导装入程序与EPROM中的初始引导程序并无不同,只是体积更大,功能更为复杂。同时由于引导装入程序的功能较强,也有利于减小对操作系统欧冠映像在磁盘上存储位置和方式的限制。

 

随着技术的发展,像EPROM一类存储器件的容量愈来愈大,为加强系统初始引导程序提供了条件,所以逐步往里面加入了如“加电自检”、“系统配置”一类的功能,(初始的)人机交互界面也逐渐得到改善。例如现在的BIOS。

对于Linux系统来说,BIOS的作用只不过就是初始引导,还有就是加电自检以及向内核提供在此过程中搜集到的一些信息(有些信息是由用户设置的)。

 

同时,由于硬盘容量的迅速发展,实际使用中常常把一个硬盘划分成若干“分区”,从而把一个物理的硬盘划分成若干个逻辑磁盘。这样一来,每个逻辑磁盘的第一个扇区仍然是引导扇区,分别用于相应逻辑磁盘中的操作系统映像(如果有的话)。但是,这些引导扇区在物理上不再是整个硬盘的第一个扇区了。在这种情况下,整个硬盘的第一个扇区不属于任何一个逻辑磁盘,或者说已经超脱于所有这些逻辑磁盘之外,上了一个层次。

但是,BIOS还是把它作为整个硬盘的引导扇区,加电时还是从这个扇区“引导”,所以称这个扇区为“主引导记录块(扇区)”MBR。MBR中含有关于盘区划分的信息(通过fdisk设置),还有一段简短的程序,一共512字节。

不过,MBR中的程序并不直接引导操作系统,而是根据盘区划分的信息从一个预定的“活跃”逻辑磁盘中读入其引导扇区,再由这个引导扇区自己采取进一步的行动。所以,可以把MBR的作用看成是为BIOS中的初始引导程序提供了一种类似于间接寻址的手段。不过,也可以把用来“引导”LILO的程序(连同有关盘区划分信息)放在MBR中,是在整个引导过程少转一道弯。

 

因此,引导扇区中的程序及其辅助程序(不包括LILO)必须是很精练的,所以都采用汇编语言编写。这些源代码都在arch/下面具体CPU名下的boot目录中。对于i386 CPU而言,在arch/i386/boot中,在该目录中有如下三个汇编语言程序:

1.  Bootsect.S:Linux引导扇区源代码,汇编后不得超过512Byte

2.  Setup.S:这是辅助程序的一部分

3.  Video.S:这个辅助程序的另一部分,用于引导过程中的屏幕显示

同时其中有一个子目录compressed,含有两个源代码文件head.S以及misc.c,这两个文件(还有lib/inflate.c)中的代码用来解压缩的(因为较新版本的内核映像都是经过压缩的),也是辅助程序的一部分。

    这样,经过编译、汇编、链接以后就形成三个组成部分,即:

引导扇区的映像bootsect,

辅助程序setup,

内核映像(通常是vmlinux)

严格来说,bootsect和setup并不是内核的一部分。其代码都是用汇编语言编写。

 

引导扇区代码arch/i386/boot/bootsect.S:

    在PC的系统结构中,线性地址0xA0000以上,即640KB以上都用于图形接口卡以及BIOS本身,在0xA0000以下的640KB为系统的基本内存。若配备更多的内存,则从0x100000,即1MB处开始,称为“高内存”。

    当BIOS(或LILO)引导一个系统时,总是把引导扇区读入到基本内存中地址为0x7c00的地方,然后就跳转到0x7c00开始执行引导扇区的代码。这段代码将其自身“搬运”到0x90000处,并跳转到那里继续执行。

然后通过BIOS提供的读磁盘调用“int 0x13”从磁盘上读入setup和内核的映像。其中setup的映像读入到地址为0x90200的地方,就是经过“搬运”后bootsect所在处的上方。然后就跳转到setup的代码中,其为后面的内核映像的执行作准备,包括映像的解压缩(如果需要的话),从BIOS收集一些数据,在控制台上显示一些信息等等。

从0x90000到0xA0000一共是64KB,bootsect只占512byte,所以setup的大小理论上可达53.5KB。

 

基本内存中开头一部分空间是保留给BIOS自己用地。另一方面对于Linux内核的引导也需要保留一些运行空间,所以一共保留了64KB。这样,基本内存中生下来可用于内核映像的就是8个64KB,即512KB,但是,在这512KB的顶端还要留下4KB用于引导命令行(LILO支持引导命令行)以及一些需要传递给内核的数据(从BIOS收到得到)。于是,基本内存中实际可用于内核映像的空间就是508KB。

 

对于大小不超过508KB的引导映像称为“小映像”,文件名为zImage;否则就称为“大内核”,文件名bzImage。

由于bzImage在基本内存中已经装载不下,所以要装载在地址为0x100000(1MB)的地方。不过,不管是zImage还是bzImage,解压缩后内核映像总是放在地址为0x100000(1MB)的地方。

 

CPU在跳转到bootsect时,处于16bit实地址模式,然后在setup的执行过程中转入32bit保护模式的段寻址方式。

在bootsect和setup的执行中,二者都利用BIOS提供的调用来完成一些比较大的操作,如读磁盘,取得BIOS在加电自检时搜集到的有关内存的信息等等。一旦转入内核映像本身的执行,就与BIOS分道扬镳,不再使用BIOS调用了。

 

辅助程序setup为内核映像的执行作好了准备(包括解压缩)以后,就跳转到0x100000开始内核本身的执行。此后就是内核的初始化过程了。

内核的初始化过程是非常漫长的过程,整个过程可以分为三个阶段。

第一阶段:

    主要是CPU本身的初始化,例如页表映射的建立;

第二阶段:

    主要是系统中一些基础设施的初始化,例如内存管理和进程管理的建立和初始化;

第三阶段(最后一个阶段):

    “上层建筑”的初始化,如根设备的安装和外部设备的初始化等等。

 

整个过程涉及的代码太大,需要分为三部分进行说明。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值