计算机启动流程

版权声明:本文为 冬夏 原创文章,可以随意转载,但请注明出处。

前言

你有没有想过,计算机是怎么启动的呢?从按下电源开始,到操作系统开始运行,计算机的工作流程是怎么样的呢?

计算器的启动流程大致如图所示。

启动自检

按下计算机的开机键后,电源首先给主板供电,此时电压不稳定,主板上的芯片组(如南北桥等)会向CPU发出并保持一个Reset信号。当电压稳定后,芯片组便撤去Reset信号,CPU开始运行,如果此时出了问题(比如CPU坏了或根本没装),那么主板上除了风扇在转之外没有任何动静。一些主板会在CPU故障或缺失时发出峰鸣提示。

如果一切正常,CPU就开始运行了。在一个多处理器或多核处理器的系统中,会有一个CPU被动态的指派为引导处理器(bootstrap processor,BSP),用于执行全部的BIOS和内核初始化代码。其余的处理器,此时被称为应用处理器(application processor,AP),一直保持停机状态直到内核明确激活他们为止。

虽然目前的CPU基本都是32位或64位的,但CPU上电时的地址线只有20位,也就是说只有1MB的内存可以寻址,这种状态叫做“实模式”,这么做主要是为了向前兼容。此时的代码可以读写物理地址、分页功能无效、没有保护和特权级的概念。

CPU上电后,大部分寄存器均复位到定义好的初始值,其中包括指令指针寄存器(EIP),它记录了下一条即将被CPU执行的指令所在的内存地址。现代32位Intel CPU的标准定义CPU复位后第一条指令的地址为0xFFFFFFF0(长16字节,在4GB内存空间的尾部,远高于1MB),虽然此时的CPU还只能寻址1MB的内存,但凭借一个奇特的技巧,一个隐藏的基地址(其实就是个偏移量)会与EIP相加,其结果指向第一条将被执行的指令所处的地址。这个特殊的地址叫做复位向量(reset vector)。

主板保证在复位向量处的指令是一个跳转,而且是跳转到BIOS(Basic Input/Output System)执行入口点所在的内存映射地址。由于芯片组提供了内存映射功能,此时的内存地址存放着CPU初始化所需的真正内容。这些内容全部是从包含有BIOS的闪存映射过来的。下面的图例列出了相关的内存区域:

随后,CPU开始执行BIOS的代码,首先初始化机器中的一些硬件。之后BIOS开始执行上电自检过程(Power On Self Test,POST),检测计算机中的各种组件(如显卡,内存,键盘等)。如果检测不到一个可用的显卡,POST就会失败,导致BIOS进入停机状态并发出鸣音提示(因为此时无法在屏幕上输出提示信息);如果检测不到键盘,会导致停机,屏幕上显示出错信息。其实POST既是检测又是初始化,还要枚举出所有PCI设备的资源——中断,内存范围,I/O端口。现代的BIOS会遵循高级配置与电源接口(ACPI)协议,创建一些用于描述设备的数据表,这些表格将来会被操作系统内核用到。

主引导记录

主引导记录(MBR,Master Boot Record)是一段长度为512字节的,用于指示操作系统所在位置以及装载操作系统的表,位于存储设备的第一个扇区,其组成结构如图所示。

其中,主引导记录最开头是第一阶段 引导代码。其主要作用是检查分区表是否正确并且在系统硬件完成自检以后将控制权交给硬盘上的引导程序(如GNU GRUB)。它不依赖任何操作系统,而且启动代码也是可以改变的,从而能够实现多系统引导。

硬盘分区表 占据主引导扇区的64个字节(偏移01BEH–偏移01FDH),可以对四个分区的信息进行描述,其中每个分区的信息占据16个字节。分区表是标准化的,与操作系统无关。具体每个字节的定义可以参见硬盘分区结构信息。

从主引导记录的结构可以知道,它仅仅包含一个64个字节的硬盘分区表。由于每个分区信息需要16个字节,所以对于采用MBR型分区结构的硬盘,最多只能识别4个主要分区(Primary partition)。所以对于一个采用此种分区结构的硬盘来说,想要得到4个以上的主要分区是不可能的。这里就需要引出扩展分区了。扩展分区也是主要分区的一种,但它与主分区的不同在于理论上可以划分为无数个逻辑分区。

扩展分区中逻辑驱动器的引导记录是链式的。每一个逻辑分区都有一个和MBR结构类似的扩展引导记录(EBR),其分区表的第一项指向该逻辑分区本身的引导扇区,第二项指向下一个逻辑驱动器的EBR,分区表第三、第四项没有用到。

结束标志字 55,AA(偏移1FEH-偏移1FFH)最后两个字节,是检验主引导记录是否有效的标志。

引导系统

POST完毕后,BIOS就准备引导操作系统了,它首先依次(可定制)将每一个存储设备(硬盘,光驱,软盘等)的第一个扇区(前512字节)读入地址为0x7C00的内存区域,并判断0x7DFE-0x7DFF(MBR的结束标志位)是否为0x55 0xAA,若不是,则尝试下一个存储设备。如果找不到合适的引导设备,BIOS会显示出错信息并停机,若找到合适的引导设备,则BIOS将CPU控制权交给MBR,而不管MBR里的代码是什么。

接下来,MBR中的引导代码将找到操作系统所在的位置并对操作系统进行引导。针对操作的数量,分为以下两种情况:

  1. 只有一个操作系统,则依次检查每一个主分区和扩展分区,判断哪个分区表是激活的(分区表第一个字节为0x80),加载那个分区的引导扇区(该分区的第一个扇区),引导扇区的作用是指出操作系统在该扇区的哪个位置,接着就会加载操作系统。

  2. 存在多个操作系统,则不加载引导扇区,而是直接加载事先安装好的启动管理器(boot loader),由用户选择启动哪一个操作系统(如Grub等)。

接着,操作系统的内核首先被载入内存并开始运行、初始化,操作系统也随着启动。

总结

计算机启动时一个软件和硬件相关的工程。

首先,CPU上电后从一个固定的地址开始取指令,这就要求主板上必须保证在该地址能够顺利到达BIOS。

接着,BIOS进行上电自检,为什么BIOS能够检查出有没有显卡,内存,鼠标等呢?一方面,主板的布线决定了每个设备的位置和地址空间;另一方面,不同品牌的硬件设备都遵循相同的通信协议,所以BIOS能够正确检测出设备。

接着,MBR定义了硬盘的分区大小、格式、引导方法以及操作系统所在位置,只有按照对应的格式和规定正确存放数据,操作系统才能最终正确启动。

更新

随着硬件的不断发展,BIOS+MBR的启动方式的缺陷也越来越显现出来,比如:BIOS启动界面只能使用键盘,而不能使用鼠标,并且通常是命令行界面,并不美观。另外,有MBR的分区表结构可以看到,每个分区表最大容量为2TB。

近年来,出现了UEFI+GPT的启动方式

其中,UEFI(Unified Extensible Firmware Interface)为统一可扩展固件接口,用来定义操作系统与系统固件之间的软件界面,作为BIOS的替代方案。可扩展固件接口负责加电自检(POST)、联系操作系统以及提供连接操作系统与硬件的接口。

由BIOS与UEFI的启动对比图可以发现,由于略过了启动时自检的过程,所以电脑开机启动速度会快不少。

GPT(GUID Partition Table)为全局唯一标识分区表,是可扩展固件接口(EFI)标准的一部分,被用于替代BIOS系统中的主引导记录(MBR)分区表。GPT磁盘分区样式支持最大为128个分区,一个分区最大18 EB(Exabytes)。

冬夏 wechat
欢迎您扫一扫上面的二维码,关注我的个人公众号:Android从入门到精通
坚持原创技术分享,您的支持将鼓励我继续创作