现在的位置: 首页 > 综合 > 正文

系统初始化 —— BIOS时代

2013年09月17日 ⁄ 综合 ⁄ 共 1832字 ⁄ 字号 评论关闭

BIOS使用实模式的地址,一个实模式的地址由一个段基址seg和一个偏移量off组成,相应的物理地址可以这样计算:seg * 16 + off。所以CPU寻址电路根本就不需要全局描述符表、局部描述符表或页表把逻辑地址转换成物理地址。显然,对GDTLDT和页表进行初始化的代码必须在实模式下运行。

 

Linux启动阶段进入BIOS时代,此时Linux最重要的工作就是从磁盘或者其他外部设备获取内核映像。这个过程主要由BIOS来完成,实际上执行了以下4步操作:

 

1.       对计算机硬件执行一系列的测试,用来检测现在都有什么设备以及这些设备是否正常工作。这个阶段通常称为POSTPower-On Self-Test,上电自检)。在这个阶段,会显示一些信息,例如BIOS版本号。

 

2.       初始化硬件设备。这个阶段在现代基于PCI的体系结构中相当重要,因为它可以保证所有的硬件设备操作不会引起IRQ线与I/O端口冲突。在这一步以后,会在屏幕闪现一下系统中所安装的所有PCI设备的一个列表。

 

3.       搜索一个操作系统来启动。计算机系统发展到当今这个时代,这个过程实际上是根据BIOS的设置顺序,在软盘、硬盘和CD-ROM的第一个扇区(引导扇区)进行访问。

 

4.       只要找到一个有效的设备,就把第一个扇区MBR的内容拷贝到RAM中从物理地址0x00007c00开始的位置,然后跳转到此处,开始执行刚才装载进来的代码。

 

5.       检查(WORD00007dfe是否等于0xaa55。若不等于则转去尝试其他介质;如果没有其他启动介质,则显示 No ROM BASIC”,然后死机;

 

6.       MBR先将自己复制到00000600处,然后继续执行;

 

7.       在主分区表中搜索标志为活动的分区。如果发现没有活动分区或者不止一个活动分区,则停止;

 

8.       将活动分区的第一个扇区读入内存地址00007c00处;

 

9.       检查(WORD00007dfe是否等于0xaa55,若不等于则显示 Missing Operating System”,然后停止;

 

10.   跳转到00007c00处继续执行特定系统的bootloader程序。

 

Linux发展到今天,从第4步开始的过程已经和过去有很大的不同了。如果是硬盘启动,这个过程是先从整个硬盘的引导扇区读入一个作为中间步骤的工具性程序(而不是操作系统映象),称为“引导装入程序(bootloader)”,再由引导装入程序装入操作系统映象。

 

当今Linux世界的bootloader已经有了长足的发展,面对各种嵌入式产品有不同的bootloader,而我们PC或服务器用得最多的就是LILOGrub。从概念上说引导装入程序同样也是使用的BIOS服务程序,只是体积更大,功能更为复杂。例如Grub就可以让用户从磁盘上的多个操作系统映象中有选择地引导。另一方面,由于引导装入程序的功能较强,也有利于减小对操作系统映象在磁盘上存储位置和方式的限制。

 

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

 

MBA中含有关于盘区划分的信息(通过fdisk设置),还有一段简短的程序,一共512字节。不过,MBR中的程序并不直接引导操作系统,而是根据盘区划分的信息从一个预定的“活跃”逻辑磁盘中读入其引导扇区,再由这个引导扇区自己采取进一步的行动。所以,可以把MBR的作用看成是为BIOS中的初始引导程序提供了一种类似于间接寻址的手段。不过,现在大家都不这么干了,用来“引导”Grub的程序(连同有关盘区划分的信息)一起放在了MBR中,使整个引导过程少转一道弯。

 

加载内核引导程序以后,POST部分的大多数代码会被从内存中清理出来,但仍然会有部分的运行时服务保留在内存之中,如后面我们会看到的hdr,供目标操作系统使用。

抱歉!评论已关闭.