BIOS
计算机在加电那一刻是毫无用处的,因为RAM芯片中包含的是随机数据,此时还没有操作系统在运行。在开始启动时,有一个特殊的硬件电路在CPU的一个引脚上产生一个RESET逻辑值。在RESET产生以后,就把处理器的一些寄存器(包括cs和eip)设置成固定的值,并执行在物理地址0xFFFFFFF0处找到的代码。硬件把这个地址映射到某个只读、持久的存储芯片中,该芯片通常称为ROM(只读存储器)。ROM中存放程序集在80X86体系中通常叫做基本输入/输出系统(BIOS),因为它包括几个中断驱动的低级过程。所有操作系统在启动时,都要通过这些过程对计算机硬件设备初始化。一些操作系统,如微软的MS_DOS,依赖于BIOS实现大部分系统调用。Linux一旦进入保护模式就不在使用BIOS,而是为计算机上的每个硬件设备提供各自的设备驱动程序。实际上,因为BIOS过程必须在实模式下运行,所以即使有益,两者之间不能共享函数。
BIOS使用实模式的地址,因为计算机加电启动时只有这些可以使用。一个实模式的地址由一个seg段和一个off偏移量组成。相应的物理地址可以这样计算:seg*16+off。所以CPU寻址电路根本就不需要全局描述符表、局部描述符表或者页表把逻辑地址换成物理地址。显然,对GDT LDT和页表的初始化的代码必须在实模式下运行。
Linux在启动阶段必须使用BIOS,此时LINUX必须要从磁盘或者其他外部设备中获取内核映像。BIOS启动过程实际上执行一下4个操作:
1. 对计算机硬件执行一系列测试,用来检测现在都有什么设备以及这些设备是否正常工作。
这个阶段通常称为POST(上电自检)。在这个阶段会显示一些信息,例如BIOS版本号。
2. 初始化硬件设备。在本阶段最后会显示系统中所安装的PCI设备的列表。
3. 搜索一个操作系统来启动。实际上,根据BIOS的设置,这个过程会试图访问系统中硬盘等设备的第一个扇区(引导扇区)。
4. 只要找到一个有效的设备,就把第一个扇区的内容拷贝到RAM中从物理地址0x00007c00开始的位置,然后跳转到这个位置处,开始执行刚才装载进的来的代码。
引导装入程序
引导装入程序(boot loader)是由BIOS用来把操作系统的内核映像装载到RAM中所调用的一个程序。
从软盘启动:
为了从软盘上启动,必须把第一个分区所存放的指令装载到RAM中并执行;这些指令再把包含内核映像的其他所有扇区都拷贝到RAM中!
在Linux 0.12内核中,软盘第一扇区存放bootsect.S代码,它由BIOS读入到内存绝对地址0x7c00处,然后执行把自己移动到绝对地址0x90000处,并把启动设备盘中后2KB(setup.S)读入到内存0x90200处,而内核其他部分代码被读入到0x10000开始处(system模块);
从硬盘启动:
硬盘的第一个扇区称为主引导扇区(MBR),该扇区共512字节,前446字节用来存放引导程序代码,之后的64字节存放分区表,最后的两个字节是0xAA55是有效引导扇区标志。前446字节存放的小程序用来装载被启动的操作系统所在分区的第一个扇区。诸如Microsoft Windows 98之类的操作系统使用分区表中所包含的一个活动(avtive)标志来标识这个分区。按照这种方法,只有那些内核映像存放在活动分区中的操作系统才可以被启动。Linux的处理方式更加灵活,因为Linux使用一个巧妙的引导装入程序取代这个MBR中不完善的程序,它允许用户来选择要启动的操作系统。
Linux早期版本(一直到2.4系列)的内核映像,在第一个512字节由一个小的引导装入程序,因此在第一扇区拷贝一个内核映像就可以是软盘启动。但是在Linux 2.6中就不在有这样的引导装入程序,所以要从软盘启动,就必须在第一个磁盘扇区存放一个合适的引导装入程序。而现在就从软盘启动与从硬盘启动或CD-ROM启动时十分相似的。
阅读(1577) | 评论(0) | 转发(0) |