您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 第2章 Linux操作系统的启动
第2章Linux系统的启动本章从系统的初始化过程介绍对Linux内核源码的分析的一种方法。系统的初始化流程包括:系统引导,实模式下的初始化,保护模式下的初始化共三个部分。和系统的引导过程相关的概念还有单用户模式、运行级别等。对这些概念的正确理解是配置和维护系统的必要条件。2.1操作系统的启动一般来说,操作系统的引导过程分两个步骤。首先,计算机硬件经过开机自检(PowerOnSelf-Test,POST)之后,从软盘或硬盘的固定位置装载一小段代码,这段代码一般称为“引导装载器”。然后,由引导装载器负责装入并运行操作系统。引导装载器非常小,一般只有几百个字节,而操作系统庞大而复杂。上述分成两阶段的引导过程,可将计算机中的固化软件保持得足够小,同时也便于实现对不同操作系统的引导。2.1.1系统引导过程简介系统启动过程主要由以下几个步骤组成(以硬盘启动为例):(1)开机(2)BIOS加电自检(PowerOnSelfTest,POST),内存地址为0ffff:0000(3)将硬盘第一个扇区(0头0道1扇区,也就是BootSector)读入内存地址0000:7c00处。(4)检查(WORD)0000:7dfe是否等于0xaa55,若不等于则转去尝试其他启动介质,如果没有其他启动介质则显示NoROMBASIC然后死机。(5)跳转到0000:7c00处执行MBR中的程序。(6)MBR首先将自己复制到0000:0600处,然后继续执行。(7)在主分区表中搜索标志为活动的分区。如果发现没有活动分区或有不止一个活动分区,则停止。(8)将活动分区的第一个扇区读入内存地址0000:7c00处。(9)检查(WORD)0000:7dfe是否等于0xaa55,若不等于则显示MissingOperatingSystem然后停止,或尝试软盘启动。(10)跳转到0000:7c00处继续执行特定系统的启动程序。(11)启动系统。以上步骤中2,3,4,5步是由BIOS的引导程序完成。6,7,8,9,10步由MBR中的引导程序完成。一般多系统引导程序(如SmartBootManager、BootStar、PQBoot等)都是将标准主引导记录替换成自己的引导程序,在运行系统启动程序之前让用户选择要启动的分区。而某些系统自带的多系统引导程序(如LILO,NTLoader等)则可以将自己的引导程序放在系统所处分区的第一个扇区中,在Linux中即为是两个扇区的SuperBlock。注:以上各步骤中使用的是标准MBR,其他多系统引导程序的引导过程与此不同。2.1.2硬盘结构1.硬盘参数当硬盘的容量还非常小的时候,人们采用与软盘类似的结构生产硬盘。硬盘盘片的每一条磁道都具有相同的扇区数。由此产生了所谓的3D参数(DiskGeometry)以及相应的寻址方式。到目前为止,通常还是沿用这种CHS(Cylinder/Head/Sector)来表示硬盘参数。其中:磁头数(Heads)表示硬盘总共有几个磁头,也就是有几面盘片,最大为256(用8个二进制位存储);柱面数(Cylinders)表示硬盘每一面盘片上有几条磁道,最大为1024(用10个二进制位存储);扇区数(Sectorspertrack)表示每一条磁道上有几个扇区,最大为63(用6个二进制位存储)。每个扇区一般是512个字节。2.基本INT13H调用简介BIOSint13H调用是BIOS提供的磁盘基本输入输出中断调用,它可以完成磁盘(包括硬盘和软盘)的复位、读写、校验、定位、诊断和格式化等功能。它使用的是CHS寻址方式,因此最大只能访问8GB左右的硬盘(本文中如不作特殊说明,均以1M=1048576字节为单位)。3.现代硬盘结构简介在老式硬盘中,由于每个磁道的扇区数相等,所以外道的记录密度要远低于内道,因此会浪费很多磁盘空间。为了进一步提高硬盘容量,人们改用等密度结构生产硬盘。也就是说,外圈磁道的扇区比内圈磁道多。采用这种结构后,硬盘不再具有实际的3D参数,寻址方式也改为线性寻址,即以扇区为单位进行寻址。为了与使用3D寻址的老软件兼容(如使用BIOSINT13H接口的软件),在硬盘控制器内部安装了一个地址翻译器,由它负责将老式3D参数翻译成新的线性参数。不同的工作模式(如LBA、LARGE、NORMAL)对应不同的3D参数。4.扩展INT13H虽然现代硬盘都已经采用了线性寻址,但是由于基本INT13H的制约,使用BIOS的INT13H接口的程序(如DOS等)还只能访问8G以内的硬盘空间。为了打破这一限制,Microsoft等几家公司制定了扩展INT13H标准(ExtendedINT13H),采用线性寻址方式存取硬盘,突破了8G的限制,并还加入了对可拆卸介质(如活动硬盘)的支持。2.1.3引导扇区1.BootSector的组成BootSector也就是硬盘的第一个扇区,它由MBR(MasterBootRecord),DPT(DiskPartitionTable)和BootRecordID三部分组成。MBR又称作主引导记录,占用BootSector的前446个字节(0to0x1BD),存放系统主引导程序(它负责从活动分区中装载并运行系统引导程序)。DPT即主分区表占用64个字节(0x1BEto0x1FD),记录了磁盘的基本分区信息。主分区表分为四个分区项,每项16字节,分别记录了每个主分区的信息(因此最多可以有四个主分区)。BootRecordID即引导区标记占用两个字节(0x1FEand0x1FF),对于合法引导区,它等于0xAA55,这是判别引导区是否合法的标志。BootSector的具体结构如下图所示:2.分区表结构简介分区表由四个分区项构成,每一项的结构如下:BYTEState:分区状态,0=未激活,0x80=激活(注意此项)BYTEStartHead:分区起始磁头号WORDStartSC:分区起始扇区和柱面号,底字节的低6位为扇区号,高2位为柱面号的第9,10位,高字节为柱面号的低8位BYTEType:分区类型,如0x0B=FAT32,0x83=Linux等,00表示此项未用BYTEEndHead:分区结束磁头号WORDEndSC:分区结束扇区和柱面号,定义同前DWORDRelative:在线性寻址方式下的分区相对扇区地址(对于基本分区即为绝对地址)DWORDSectors:分区大小(总扇区数)在DOS/Windows系统下,基本分区必须以柱面为单位划分(Sectors*Heads个扇区),如对于CHS为764/256/63的硬盘,分区的最小尺寸为256*63*512/1048576=7.875MB。由于硬盘的第一个扇区已经被引导扇区占用,所以一般来说,硬盘第一个磁道(0头0道)的其余62个扇区是不会被分区占用的。某些分区软件甚至将第一个柱面全部空出来。3.扩展分区由于主分区表中只能分四个分区,无法满足需求,因此设计了一种扩展分区格式。基本上说,扩展分区的信息是以链表形式存放的,但也有一些特别的地方。首先,主分区表中要有一个基本扩展分区项,所有扩展分区都隶属于它,也就是说其他所有扩展分区的空间都必须包括在这个基本扩展分区中。对于DOS/Windows来说,扩展分区的类型为0x05或0x0F(LBA模式)。除基本扩展分区以外的其他所有扩展分区则以链表的形式级联存放,后一个扩展分区的数据项记录在前一个扩展分区的分区表中,但两个扩展分区的空间并不重叠。扩展分区类似于一个完整的硬盘,必须进一步分区才能使用。但每个扩展分区中只能存在一个其他分区。此分区在DOS/Windows环境中即为逻辑盘。因此每一个扩展分区的分区表(同样存储在扩展分区的第一个扇区中)中最多只能有两个分区数据项(包括下一个扩展分区的数据项)。以上所有扩展分区表中的第二个分区项(指向下一个扩展分区)的相对扇区地址均相对于主扩展分区,而不是前一个扩展分区。2.2Linux的引导过程不同计算机平台引导过程的区别主要在于第一阶段的引导过程。对PC机上的Linux系统而言,计算机(即BIOS)负责从软盘或硬盘的第一个扇区(即引导扇区)中读取引导装载器,然后,由引导装载器从磁盘或其他位置装入操作系统。从软盘引导时,BIOS读取并运行引导扇区中的代码。引导扇区中的代码读取软盘前几百个块(依赖于实际的内核大小),然后将这些代码放置在预先定义好的内存位置。利用软盘引导Linux时,没有文件系统,内核处于连续的扇区中,这样安排可简化引导过程。但是,如果利用LILO(LInuxLOader)也可从包含文件系统的软盘上引导Linux。从硬盘引导时,由于硬盘是可分区的,因此引导过程比软盘复杂一些。BIOS首先读取并运行硬盘主引导记录中的代码,这些代码首先检验主引导记录中的分区表,寻找到活动分区(即标志为可引导分区的分区),然后读取并运行活动分区之引导扇区中的代码。活动分区引导扇区的作用和软盘引导扇区的作用一样:从分区中读取内核映象并启动内核。和软盘引导不同的是,内核映象保存在硬盘分区文件系统中,而不象软盘那样保存在后续的连续扇区中,因此,硬盘引导扇区中的代码还需要定位内核映象在文件系统中的位置,然后装载内核并启动内核。Linux系统的常见引导方式有两种:LILO引导和Loadin引导;其中LILO可实现多重引导,Loadin可在DOS下引导Linux。此外,Linux内核也自带了一个bootsect-loader。由于bootsect-loader只能实现Linux的引导,不像前两个那样具有很大的灵活性,所以在普通应用场合实际上很少使用。但由于bootsect-loader短小、没有多余的代码、并且是内核源码的有机组成部分。下面将主要对bootsect-loader文件进行分析。bootsect-loader在内和源码中对应的程序是/arch/i386/boot/bootsect.s。几个相关文件是:(1)/arch/i386/boot/bootsect.s(2)/include/linux/config.h(3)/include/asm/boot.h(4)/include/linux/autoconf.h2.2.1Linux系统引导过程分析开启Intelx86PC的电源后,机器就会开始执行ROMBIOS的一系列系统测试动作,包括检查RAM、键盘、显示器和软硬磁盘等。接着控制权转移给ROM中的启动程序(ROMbootstraproutine);该程序会将磁盘上的第0轨第0扇区(称为bootsector或MasterBootRecord,MBR,系统的引导程序就放在此处)读入内存,放入自0x07C0:0x0000开始的512个字节处;然后处理机跳转到该处开始执行(位于该处的)MBR引导程序,CS:IP=0x07C0:0x0000。加电后处理机运行在与8086相兼容的实模式下。如果要用bootsect-loader进行系统引导,则必须把bootsect.s编译连接后对应的二进制代码置于MBR;当ROMBIOS把bootsect.s编译连接后对应的二进制代码装入内存后,机器的控制权就完全转交给bootsect;也就是说,bootsect将是第一个被读入内存中并执行的程序。Bootsect接管机器控制权后,将依次进行以下一些动作:(1)首先,bootsect将它“自己”(自位置0x07C0:0x0000开始的512个字节)从被ROMBIOS载入的地址0x07C0:0x0000处搬到0x9000:0000处;这一任务由bootsect.s的前十条指令完成;第十一条指令“jmpigo,INITSEG”则把机器跳转到“新”的bootsect的“jmpigo,INITSEG”后的那条指令“go:movdi,#0x4000-12”;之后,继续执行bootsect的剩下的代码;在bootsect.s中定义了几个常量:BOOTSEG=0x07C0bios载入MBR的约定位置的段址;INITSEG=0x9000bootsect.s的前十条指令将自己搬到此处(段址)SET
本文标题:第2章 Linux操作系统的启动
链接地址:https://www.777doc.com/doc-1908459 .html