全部博文(1493)
分类: LINUX
2015-04-09 14:11:42
原文地址:Linux内核引导过程(一):BIOS引导 作者:wbf420
BIOS系统设置程序
BIOS系统设置程序,就是通常我们在开机时按下Del键进入的程序,习惯上也称为“BIOS设置”,用来配置系统基本情况、CPU特性、硬盘、PCI,板载网卡等硬件的信息。这些信息存放在一块可读写的CMOS芯片中。CMOS(Complementary Metal Oxide Semiconductor,互补金属氧化物半导体)本身只是一块存储器,只具有保存数据的功能,由系统通过一块后备电池供电,因此无论是在关机状态,还是遇到系统掉电情况,CMOS信息都不会丢失。对CMOS中各项参数的设定和修改要通过专门的程序进行,BIOS系统设置程序就这样的程序。
BIOS中断服务程序
BIOS中断服务程序实质上是系统中软件与硬件之间的一个可编程接口,主要用来在程序软件与硬件之间实现衔接。例如,操作系统中对软盘、硬盘、光驱、键盘、显示器等外围设备的管理,都是直接建立在BIOS系统中断服务程序的基础上,可以通过汇编代码调用INT 5、INT 13等中断而直接调用BIOS中断服务程序。
BIOS加电自检务程序
PC按通电源后,系统首先由POST(Power On Self Test,上电自检)程序来对内部各个设备进行检查。通常完整的POST自检将包括对CPU、640K基本内存、 1M以上的扩展内存、ROM、主板、CMOS存贮器、串并口、显示卡、软硬盘子系统及键盘进行测试,一旦在自检中发现问题,系统将给出提示信息或鸣笛警告。
BIOS系统引导程序
系统在完成 POST自检后,就首先按照CMOS设置中保存的启动顺序搜索硬盘、CD-ROM、网络服务器等有效地启动驱动器,读入操作系统引导记录,然后将系统控制权交给引导记录,并由引导记录来完成系统的顺利启动。系统BIOS所在的ROM是被设计成CPU可直接寻址的,而且地址范围也是固定的,从F0000H至FFFFFH共64KB。PC按通电源后,电源设备开始向主板和其他设备供电,此时电压还不太稳定,主板上的控制芯片组会向CPU发出并保持一个RESET(重置)信号,让CPU内部自动恢复到初始状态,但CPU在此刻不会马上执行指令。当芯片组检测到电源已经开始稳定供电了(当然从不稳定到稳定的过程只是一瞬间的事情),它便撤去RESET信号(如果是手工按下计算机面板上的Reset按钮来重启机器,那么松开该按钮时芯片组就会撤去RESET信号)CPU进行重置,IP寄存器的值设成0,CS寄存器的值设成0xFFFF。也就是说CPU马上从地址FFFF0H处开始执行指令,这个地址在系统BIOS空间的地址范围内,CPU就是从这个固定的地址开始执行BIOS程序的。
各厂家的BIOS程序不尽相同,但基本都是完成POST自检及本地设备的枚举和初始化,包括对硬件执行一系列的测试,用来检测现在都有什么设备以及这些设备是否能正常工作,在这个阶段中,会显示一些信息,例如BIOS版本号等;初始化硬件设备,这个阶段在现代基于PCI的体系结构中相当重要,因为它可以保证所有的硬件设备操作不会引起IRQ线与I/O端口的冲突,在本阶段的最后,会显示系统中所安装的所有PCI设备的一个列表等。
BIOS自检和初始化完成后,开始执行BIOS引导程序。由于系统BIOS空间只有64KB大小,把Linux内核放在这个空间里让BIOS引导程序直接引导是不可能的,只能把内核放在硬盘里(或其他设备,如USB或网络上, BIOS根据启动顺序的设置依次查找),然后再从硬盘里引导Linux内核。但是,这时系统还处于实模式中,寻址能力只有1MB,没有硬盘上的文件系统等信息,不会直接的引导整个Linux内核,而是通过先载入一个引导装入程序,然后由这个引导装入程序来引导Linux内核。
引导装入程序通常放在第一块硬盘(或其他设备)的第一个里,这个扇区就是主引导扇区,包括硬盘MBR(Master Boot Record)、DPT(Disk Partition Table)及主引导扇区标志“55AA”,共512个字节。系统BIOS引导程序的唯一任务就是把存放在MBR中的引导装入程序载入内存的0x7C00位置(可以通过BIOS中断方式INT 13h读取磁盘指定扇区的内容),然后CPU跳转到这个地址,把控制权交给引导装入程序继续引导系统。GRUB(GRand Unified Bootloader)就是这样的一个引导程序。
GRUB引导过程
GRUB(GRand Unified Bootloader)是一个多重启动管理器。它可以在多个操作系统共存时选择启动哪个系统,可以启动的操作系统包括Linux, FreeBSD, Solaris, NetBSD, BeOS, OS/2, Windows 95/98 /NT /2000。它可以载入操作系统的内核和初始化操作系统(如Linux, FreeBSD),或者把启动权交给操作系统(如Windows 98)来完成启动。
GRUB的实质是一个mini os,它拥有shell,支持script,支持特定文件系统等。GRUB由stage1,stage1_5,stage2以及/boot/grub目录下的诸多文件(包括Grub的配置文件与相关文件系统定义文件等)组成。
stage1被编译成了一个512字节的img,写在硬盘的0面0道第1扇,它所做的唯一的事情就是装载第二引导装载程序stage2。
stage1_5写进了MBR后的15个扇区中(因为e2fs_stage1_5大小为7.5k)。硬盘上第一个文件系统分区的开始扇区最小也只能从0柱面,1磁头,1扇区开始。就是说MBR所在0磁头就只用到了1个扇区而已(其它扇区都是未用的,不属于任何分区),按照现在硬盘的规格来说,一般一个柱面磁头都有60+个扇区,所有将stage1_5写进MBR以后的扇区中,不会影响正常的文件系统分区。stage1_5就是文件系统的解释代码,根据/boot分区(或/boot所在分区)的具体文件系统类型而异,如:ext3分区的话就是 e2fs_stage1_5。在stage1_5没有被加载以前,系统无法识别任何文件系统(但是可以通过BIOS中断方式INT 13h读取磁盘指定扇区的内容), 加载stage1_5以后就可以识别/boot所在分区的文件系统了,从而为加载stage2作好了准备。
stage2是grub最核心的部分有100多KB,所以只能放在文件系统中,放在/boot分区里,放在这里的通常还有Linux内核映像文件。加载stage2后grub会根据menulist或用户输入加载Linux内核映像文件,即将内核映像装入地址0x90000的内存中,将内核入口装入到地址0x90200的内存中,然后跳转到内核入口处开始启动内核。