由UEFI与Legacy引出的Operating System Boot

——From《Operating System Concept》、《Understanding the Linux Kernel》、《UEFI原理与编程》、《linux内核设计的艺术》、Wikipedia

最近一段时间没事乱搞,在原有的win10与CentOS双系统的基础上又挂了一块硬盘,加了一个win7,然后grub引导就找不见了,只好。。。再装一个Kali linux来找回引导,整来整去最后发现win7覆盖了win10的引导,并且将引导放在了新加硬盘开头,那就只能在原有硬盘上建立一个新的grub引导。。。装是装好了,各种不明白啊。。。还是找几本书研究研究,越来越感觉操作系统真的是深似海啊

计算机启动是一个非常奇妙的过程,简单讲就是让各个部分通电工作,并且唤醒这些硬件部分的管理系统,也就是操作系统,这个过程也叫boot,虽然来自于”pull oneself up by one’s bootstraps”,但是更像是固件将操作系统拉起来,而不是操作系统自己。

启动过程:

  1. 硬件阶段:按下电源键后,电流经过一系列数字电路的传导到达了CPU及各种硬件,各种门电路的设置使得相关寄存器按照要求初始化,之后开始执行预先存储在硬件的机器码,一切程序开始于0xFFFF0——无论嵌入式系统还是平时用的Windows、Linux(感觉只不过嵌入式更接近硬件层)……CPU在通电后将寄存器初始化,清零置一之后开始读CS:IP,也就正式进入了BIOS入口,而启动了BIOS也就意味着,整个系统要以更像软件的方式开始运行了。
    • UEFI与Legacy就是BIOS,更确切的说是起到了BIOS这个角色的作用,Legacy可以理解为用狭义的BIOS方式启动,BIOS狭义是指1975年诞生的一种引导或者说系统初始化技术,简单而又精深,基本上包括加电之后检查一下硬件(自检,POST),各种硬件设备的初始化(信息收集等),构建中断向量表、I/O处理、CMOS设置以及将操作系统的引导读入内存。但随着32位CPU的淘汰,UEFI作为BIOS的替代者逐渐被不断使用。UEFI主要有7个阶段:SEC(安全验证)-> PEI(EFI前期初始化)-> DXE(驱动执行环境)-> BDS(启动设备选择)-> TSL(操作系统加载前期) -> RT(Run Time) -> AL(系统灾难恢复期)。而UEFI启动则是从基于UEFI的BIOS系统直接切换到操作系统,速度会更快uefi
  2. BIOS阶段:BIOS被启动后,按照被烧在ROM中的机器码一行行执行,其实BIOS已经可以算得上一个小型的操作系统,可以“一定程度上”管理硬件,提供I/O处理,最后将真正的操作系统的引导载入内存来让CPU运行。一些厂商(ASUS等)BIOS的页面已经设计的蛮漂亮了。BIOS作为硬件与操作系统之间存在的另一个操作系统,存在的价值在于提供了一个固定的启动接口,操作系统也可以直接启动硬件,并且我感觉会更快,但是不同厂商不同时代的操作系统与硬件之间便无法调和,而BIOS在中间作为一个标准就可以使双方能够相互兼容。
  3. 操作系统引导阶段:在BIOS控制整个系统的最后阶段,计算机硬件体系结构的设计与BIOS共同操作产生一个中断(int 0x19)然后触发中断服务——将操作系统所在硬盘(启动盘)的第一扇区加载进内存的指定位置,然后操作系统开始接管。在最早的linux版本中(linux0.11),boot目录下的三个文件bootsect.s、setup.s和head.s的作用就是让操作系统开始接管硬件(寄存器与中断这个层次),进一步加载操作系统(内核),为第一个进程做准备。当一切准备就绪,CPU从16位实模式也转到了32位后,main.c函数正式被调用,对硬件进一步进行较高层次(SystemCall系统调用层次)的初始化(内存,I/O设备等等),以及初始化进程0。进程0要做的就是调用fork函数创建进程1,并进行更高层次(分页、文件系统)的初始化。非常简单的讲,操作系统的引导大概是这么一个过程,基本上到这里操作系统已经开始有条不紊地运行了,根据想要的效果开启需要的服务。
    • 说到启动盘和第一扇区就不得不提到MBR分区和GPT分区了。我们知道磁盘上的每个磁道被等分为若干个弧段,这些弧段便是硬盘的扇区(Sector)。硬盘的第一个扇区,叫做引导扇区,也就是MBR,用来存储整个磁盘的信息。在MBR分区方式中,MBR(Master Boot Record)位于硬盘首个扇区(0号扇区),0号扇区用于存放启动代码与主分区表。0~439字节为启动代码;446~509位主分区表。主分区表区域最多可容纳4个分区表项,所以更多的分区就需要扩展分区。MBR带有浓重的32位体系结构的印记。在每个分区表项中,用4个字节(StartingLBA)表示该分区的起始扇区号,4个字节(SizeInLBA)表示该分区拥有的总扇区数,因而MBR分区最多可用到硬盘的前4G个扇区(4G*512B=2TB)。BootIndicator是分区状态,00为非活动分区,80活动分区(表示该分区可启动)。“分区类型描述”是分区类型标志,也称为文件系统标志位,表示该分区的类型。“起始CHS”和”结束CHS”是比较“古老”的寻址方式,现在一般不用。MBR分区规范没有提供分区表备份机制,一旦0号扇区分区表区域被破坏,分区表将很难恢复,只能格式化再重新写入了。%e6%8d%95%e8%8e%b7mbr为了弥补MBR的不足,Intel在90年代开发了GPT(GUID Patition Table),与MBR作用基本相同,但相比MBR,GPT支持更大的容量更多分区以及更好的安全性。GPT硬盘仍将硬盘划分扇区。所有扇区统一编址,地址从0开始编号,扇区地址称为LBA(Logic Block Address)。0号扇区是保护性MBR,用于兼容MBR硬盘;1号扇区是GPT头,描述了GPT硬盘的结构;2~33号分区,共32个扇区,是GPT硬盘的分区表。硬盘末尾的33个分区用于备份分区表和GPT头。gpt硬盘的最后一个扇区用于备份GPT头。当计算机系统读取硬盘GPT头时,会计算表头的CRC32校验码,如果计算出的校验码与硬盘中存储的不一致,则系统会尝试从备份表头恢复GPT头。gpt1GPT表头的PatitionEntryLBA域指明了分区表的LBA地址i,NumberOfPatitionEntries域指明了分区数目。从理论上讲,GPT分区的数目可以有264个,但在实际中,2~33号扇区用于存放分区表,每个分区表项占256字节,因而最多有128个分区。分区表与表头有同样的备份机制。gpt2
  4. 现在操作系统的引导阶段一般都有专门的高层的程序来管理,比如Linux下的lilo和grub和windows下的,可以分别在grub.cfg和boot.ini中配置。其中的过程也比上述Linux0.11的引导过程要复杂很多,毕竟系统本身也要复杂得多。但基本的过程没有改变,所以在原有系统的引导被覆盖后,只要分区没有受到影响,重新在磁盘第一扇区重建引导就还能找回原来的系统。

发表评论

电子邮件地址不会被公开。 必填项已用*标注