计算机启动过程


一.计算机启动基本流程

计算机的整个启动过程主要是按顺序执行三个独立存放的程序,分别是:
1.存在ROM中的BIOS;
2.存放在启动设备(通常就是磁盘)第一个扇区,也就是MBR(Master Boot Record,主引导记录)中的bootloader,常用的bootloader有grub和uboot;
3.存放在磁盘中的linux操作系统内核, 通常在/boot目录下,文件名类似boot/vmlinuz-4.15.0-54-generic。

我们知道计算机执行的程序是需要先加载到内存中才能由cpu读取执行,BIOS存放在ROM中,而ROM正是内存的一部分, 只是ROM中的程序在系统掉电后不会消失,相当于是固化到ROM中的固件。BIOS在电脑主板出厂的时候就已经由厂家烧录到ROM中了。 所以在计算机上电的时候,系统首先执行的就是ROM中的BIOS了。

而bootloader和操作系统linux内核程序都是存放在磁盘上的, 这两个程序是在安装linux操作系统的时候安装到磁盘中的,bootloader被安装到磁盘的第一个扇区,即MBR,而linux内核则通常被安装到/boot/目录下。 所以这两个程序在执行之前都需要从磁盘加载到内存中才能执行,bootloader被BIOS加载到内存,而linux内核则由bootloader加载到内存。

综上所述,计算机的整个启动过程可以概述为如下三大步骤:
bios-->bootloader-->linux
1.执行ROM中的BIOS;
2.BIOS将启动设备第一个扇区即MBR中的bootloader加载到内存并执行;
3.bootloader将磁盘中的linux内核加载到内存中并执行。
PC机启动时,cpu首先执行ROM中的BIOS,ROM BIOS会将默认启动驱动器上的引导扇区(MBR)中的bootloader读入内存, bootloader将操作系统内核读入内存,并将控制权交给操作系统内核代码。

二.计算机开机启动详细流程

第一步:开机上电

按下电源开关,电源向主板和其它设备供电,此时电压还不是很稳定,主板上的控制芯片组会向CPU发出并保持一个reset(重置)信号, 让CPU内部自动恢复到初始状态,当芯片组检测到电源已经开始稳定的供电了(从不稳定到稳定的过程中只需要一瞬间即可), 芯片组则开始撤去reset信号,CPU从地址0xFFFF0处开始执行指令,该地址为ROM只读存储器,是在系统BIOS的地址范围内,这里存放的只是一条跳转指令,指向BIOS中真正的启动代码。

第二步:BIOS启动,POST自检(Power-On-self-test)

BIOS为基本输入输出系统(Basic Input Output System)的简称,是固化在计算机主板ROM(Read-Only Memory只读存储器)芯片上的一组程序代码,不需要供电就可保持数据不丢失,BIOS保存着计算机最重要的基本输入输出的程序、系统设置信息、开机上电自检程序和系统启动自检程序。
BIOS各程序功能及作用:
a.POST上电自检及初始化: 自诊断程序通过读取CMOS RAM中的内容识别硬件配置,并对其进行自检和初始化,执行不同初始化和计算机硬件检测的函数或例程,开机后BIOS最先被启动, 然后它会对电脑的硬件设备(CPU、640K基本内存(640K BASE MEMORY)、1MB以上扩展内存(EXTEND MEMORY)、ROM(READ-ONLY MEMORY,只读存储器)、 主板、CMOS存储器、串口、并口、显卡、软盘子系统、硬盘子系统、键盘)进行完全彻底的检验和测试
b.BIOS 操作系统启动程序: 完成 POST 自检后, ROM BIOS 将按照系统 CMOS 设置中的启动顺序搜寻软硬盘驱动器及 CDROM 、网络服务器等有效的启动驱动器, 系统自动装载程序在系统自检成功后,将磁盘相对0道0扇区上的引导程序装入内存使其运行。 读入操作系统引导记录,然后将系统控制权交给引导记录,由引导记录完成系统的启动。
c.BIOS 中断服务程序: 开机时,BIOS会告诉CPU各硬件设备的中断号,当用户发出使用某个设备的指令后,CPU就根据中断号使用相应的硬件完成工作,再根据中断号跳回原来的工作。
d.I/O驱动程序服务:BIOS直接与计算机的I/O(Input/Output,即输入/输出)设备打交道,通过特定的数据端口发出命令,传送或接收各种外部设备的数据,实现软件程序对硬件的直接操作
e.BIOS系统设置程序: CMOS设置程序,引导过程中,通过特殊热键启动,进行设置后,存入CMOS RAM中。 机器部件的配置情况是存放在一块可读写的 CMOS RAM 芯片中的,它保存着系统 CPU 、软硬盘驱动器、显示器、键盘等部件的信息。 关机后,系统通过一块后备电池向 CMOS 供电以保持其中的信息。如果 CMOS 中关于微机的配置信息不正确,会导致系统性能降低、零部件不能识别,并由此引发一系统的软硬件故障

BIOS启动后,第一件事情就是执行POST自检阶段,主要针对系统的一些关键设备是否存在或者功能是否正常,如:内存、显卡等。 BIOS程序首先检查,计算机硬件能否满足运行的基本条件,这叫做”硬件自检”(Power-On Self-Test),缩写为POST。
如果在POST过程中系统设备存在致命的问题,BIOS将会发出声音来报告检测过程中出现的错误,声音的长短及次数对应着系统的错误类型。
POST过程会非常快速,对用户几乎感觉不出来。如果硬件出现问题,主板会发出不同含义的蜂鸣,启动中止。如果没有问题,则显示器屏幕就会显示出CPU、内存、硬盘等信息。
显卡初始化:在POST过程中,BIOS会去查找显卡的BIOS,并且去调用显卡BIOS的代码,由显卡BIOS去初始化显卡,这个时候显示器一般会显示一些初始化的信息,
同时系统BIOS也会去查找其它设备的BIOS,分别调用她们的初始化代码来初始化设备。
BIOS报错声音对应链接:https://baike.baidu.com/item/BIOS%E6%8A%A5%E8%AD%A6%E5%A3%B0/4231622?fr=aladdin

bios和cmos的详细信息参考:BIOS和CMOS

第三步:启动顺序

硬件自检完成后,BIOS把控制权转交给下一阶段的启动程序。
这时,BIOS需要知道下一个阶段要启动的程序具体放在了哪一个设备上。也就是说,BIOS需要有一个外部储存设备的排序,排在前面的设备就是优先转交控制权的设备。
这种排序叫做”启动顺序”(Boot Sequence)。
打开BIOS的操作界面,里面有一项就是”设定启动顺序”。我们可以开机进入BIOS的去调节启动设备的优先级。

第四步:主引导记录

BIOS按照”启动顺序”,把控制权转交给排在第一位的储存设备。即根据用户指定的引导顺序从软盘、硬盘或是可移动设备中读取启动设备的MBR,并放入指定的位置(0x7c000)内存中。
BIOS按照设定好的启动顺序,将控制权交给排在第一位的存储设备,即开始从第一位设备中读取设备的MBR,并且将程序放在0x7c000的内存地址位中。
这时,计算机读取该设备的第一个扇区,也就是读取最前面的512个字节。如果这512个字节的最后两个字节是0x55和0xAA,表明这个设备可以用于启动; 如果不是,表明设备不能用于启动,BIOS会继续去找下一个设备,并将控制权转交给”启动顺序”中的下一个设备。
这最前面的512个字节,就叫做”主引导记录”(Master boot record),简称MBR
存储设备中的第一个扇区,磁盘最前面的512Byte,称为“主引导扇区”(Master boot record,缩写为MBR)

主引导记录的结构

主引导记录MBR很小,只有512个字节,放不了太多东西,存放程序很小。主要作用是,告诉计算机到硬盘的哪一个位置去找操作系统。
主引导记录由三个部分组成:
1、第1-446字节:调用操作系统的程序机器码。
2、第447-510字节:分区表(Partition table)。
3、第511-512字节:主引导记录签名(0x55和0xAA)。
其中,第二部分”分区表”的作用,是将硬盘分成若干个区。

分区表

硬盘分区有很多好处。考虑到每个区可以安装不同的操作系统,主引导记录MBR因此必须知道将控制权转交给哪个区。
分区表的长度只有64个字节,里面又分成四项,每项16个字节。所以,一个硬盘最多只能分四个一级分区,又叫做”主分区”。
每个主分区的16个字节,由6个部分组成:
(1) 第1个字节:如果为0x80,就表示该主分区是激活分区,控制权要转交给这个分区。四个主分区里面只能有一个是激活的。
(2) 第2-4个字节:主分区第一个扇区的物理位置(柱面、磁头、扇区号等等)。
(3) 第5个字节:主分区类型。
(4) 第6-8个字节:主分区最后一个扇区的物理位置。
(5) 第9-12字节:该主分区第一个扇区的逻辑地址。
(6) 第13-16字节:主分区的扇区总数。
最后的四个字节(”主分区的扇区总数”),决定了这个主分区的长度。也就是说,一个主分区的扇区总数最多不超过2的32次方。
如果每个扇区为512个字节,就意味着单个分区最大不超过2TB。再考虑到扇区的逻辑地址也是32位,所以单个硬盘可利用的空间最大也不超过2TB。
如果想使用更大的硬盘,只有2个方法:一是提高每个扇区的字节数,二是增加扇区总数。
磁盘的详细信息参考:磁盘构造和磁盘分区

第五步:加载启动bootloader(硬盘启动)

这时,计算机要将控制权转交给硬盘的某个分区,这里又分成三种情况。
3.1 情况A:卷引导记录
四个主分区里面,只有一个是激活的。计算机会读取激活分区的第一个扇区,叫做”卷引导记录”(Volume boot record,缩写为VBR)。
“卷引导记录”的主要作用是,告诉计算机,操作系统在这个分区里的位置, 可以开始加载操作系统。然后,计算机就会加载操作系统了。
3.2 情况B:扩展分区和逻辑分区
随着硬盘越来越大,四个主分区已经不够了,需要更多的分区。但是,分区表只有四项,因此规定有且仅有一个区可以被定义成”扩展分区”(Extended partition)。可以在扩展分区中继续分区
所谓”扩展分区”,就是指这个区里面又分成多个区。这种分区里面的分区,就叫做”逻辑分区”(logical partition)。
扩展分区:分区表只有四项,因此规定有且仅有一个区可以被定义成”扩展分区”(Extended partition)。
逻辑分区:指在扩展区里面又分成多个区。这种分区里面的分区,就叫做”逻辑分区”(logical partition)
计算机先读取扩展分区的第一个扇区,叫做”扩展引导记录”(Extended boot record,缩写为EBR)。它里面也包含一张64字节的分区表,但是最多只有两项(也就是两个逻辑分区)。
计算机接着读取第二个逻辑分区的第一个扇区,再从里面的分区表中找到第三个逻辑分区的位置,以此类推,直到某个逻辑分区的分区表只包含它自身为止(即只有一个分区项)。
因此,扩展分区可以包含无数个逻辑分区。
但是,似乎很少通过这种方式启动操作系统。如果操作系统确实安装在扩展分区,一般采用下一种方式启动。
3.3 情况C:启动管理器
在这种情况下,计算机读取”主引导记录”前面446字节的机器码之后,不再把控制权转交给某一个分区,而是运行事先安装的”启动管理器”(boot loader),由用户选择启动哪一个操作系统。
Boot loader:是在操作系统内核运行之前运行。可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境
Linux环境中,目前最流行的启动管理器是Grub。
对于grub而言,在MBR中的446字节的引导程序属于GRUB的开始执行程序。

第六步:加载并启动操作系统

控制权转交给操作系统后,操作系统的内核被载入内存。内核代码若要正常运行就需要文件系统的支持。
以Linux系统为例,先载入/boot目录下面的kernel。内核加载成功后,第一个运行的程序是/sbin/init。它根据配置文件(Debian系统是/etc/initab)产生init进程。 这是Linux启动后的第一个进程,pid进程编号为1,其他进程都是它的后代。
然后,init线程加载系统的各个模块,比如窗口程序和网络程序,直至执行/bin/login程序,跳出登录界面,等待用户输入用户名和密码。
至此,全部启动过程完成。

开机流程中的BIOS与UEFI开机检测程序

回到顶部
并不是所有的操作系统都可以读取GPT磁盘分区格式!也不是所有的硬件都可以支持GPT格式! 是否能够读写GPT格式又与开机检测程序BIOS或UEFI有关! 操作系统作为计算机软件,可以控制计算机硬件资源的合理分配! 操作系统可以识别硬盘分区文件系统,并且进一步的读取硬盘内的软件文件与执行该软件来达成各项软件的执行目的。
既然操作系统也是软件,那么计算机是如何认识这个操作系统软件并且执行的? 开机时计算机还没有任何软件系统,要如何读取硬盘内的操作系统文件呢? 这就要牵涉到计算机的开机启动程序了!
基本上,目前的主机系统在加载硬件驱动方面的程序,主要有早期的BIOS与新的UEFI两种机制!

BIOS识别MBR/GPT的开机流程

回到顶部
全面谈论过BIOS与CMOS, CMOS记录各项硬件参数且嵌入在主板上面的储存器, BIOS则是一个写入到主板上的一个固件(再次说明, 固件就是写入到硬件上的一个软件程序)。 BIOS就是计算机开机上电后执行的第一个程序!
BIOS会分析计算机有哪些储存设备,根据用户的设置获取启动设备,通常就是硬盘, 读取启动硬盘第一个扇区MBR中开头446bytes空间内的开机管理程序bootloader, 将开机启动程序bootloader加载到内存中运行。 BIOS就功成身退了!
开机管理程序是在安装操作系统的时候由操作系统安装程序写入磁盘第一个扇区的开头446bytes空间内。 开机管理程序bootloader的工作就是加载(load)linux内核文件, bootloader可以识别硬盘内的文件系统格式,读取内核文件, 将内核文件加载到内存中运行!
整个开机流程概括如下:
1. BIOS:开机上电执行的第一个固件程序,可以识别第一个可开机的设备;
2. MBR:第一个可开机设备的第一个扇区内的主要启动记录区块,内含开机管理程序bootloader;
3. 开机管理程序(boot loader):可读取并加载内核文件;
4. 内核文件:开始操作系统的功能...
如果分区表为GPT格式,BIOS也能够从LBA0的MBR兼容区块读取到开机管理程序代码, 如果开机管理程序可以认识GPT分区, 那么也就可以顺利加载操作系统内核!如果开机管理程序无法识别GPT,例如Windows XP的环境,就无法读取内核文件,开机就失败了!
由于LBA0仅提供第一阶段的开机管理程序代码,如果使用类似grub的开机管理程序, 需要额外分出一个BIOS boot分区, 这个分区放置开机管理程序所需的配置文件! 在CentOS当中,这个分区通常占用2MB左右。
由上面的说明可知,BIOS与MBR都是硬件本身支持的功能,至于Boot loader则是操作系统安装在MBR上面的一套软件了。 由于MBR仅有446bytes,因此这个开机管理程序是非常小而美的。
这个boot loader的主要功能特点有如下几项:
提供菜单选项:用户可以选择不同的开机项目,这也是多重引导的重要功能!
加载操作系统内核文件:直接指向可开机的程序区段来开始操作系统;
转交其他loader:将开机管理功能转交给其他loader负责。
前两点很容易理解,第三点说明计算机系统里面可能具有两个以上的开机管理程序! 硬盘只有一个MBR! 但是开机管理程序除了可以安装在MBR之外, 还可以安装在每个分区的启动扇区(boot sector)中! 分区还有自己的启动扇区!这样就可以进行多重引导的功能了!
假设只有一个硬盘,分成四个分区,其中第一、二分区分别安装了Windows及Linux, 要如何在开机的时候选择用Windows还是Linux开机呢? 假设MBR内安装的是可同时认识Windows/Linux操作系统的开机管理程序, 那么整个流程可以图标如下:
linux磁盘组成 图 开机管理程序的工作执行示意图
开机管理程序提供两个开机选项,选项一(M1)可以直接加载Windows内核文件开机; 选项二(M2)则是将开机管理工作交给第二个分区的启动扇区(boot sector)。 当用户在开机的时候选择选项二时, 整个开机管理工作就会交给第二分区的开机管理程序。
当第二个开机管理程序启动后,该开机管理程序内仅有一个开机选项,因此就能够使用Linux的内核文件来开机了。 这就是多操作系统的多重引导!总结如下:
每个分区都有自己的启动扇区(boot sector);
图中硬盘共有两个分区,实际可开机的内核文件放置到各分区内!
loader只会识别自己所在分区内的可开机内核文件,以及其他loader;
loader可直接指向或者是间接将管理权转交给另一个管理程序。
为什么常常说如果要安装多重引导, 最好先安装Windows再安装Linux呢? 这是因为Linux在安装的时候,可以选择将开机管理程序安装在MBR或其他分区的启动扇区内, Linux的loader可以手动设定选项(就是上图的 M1, M2...), 所以可以在Linux的boot loader里面加入Windows的开机选项;
而Windows在安装的时候,安装程序会主动的覆盖掉MBR以及自己所在分区的启动扇区,没有选择的机会, 而且他没有让我们自己选择选项的功能。
因此,如果先安装Linux再安装Windows的话,那MBR的开机管理程序就只会有Windows的项目,而不会有Linux的项目, 因为原本在MBR内的Linux的开机管理程序就会被覆盖掉。 需要重新安装Linux吗?不需要,只要用各种方法来处理MBR的内容即可。
例如利用Linux的救援模式来挽救MBR啊! 开机管理程序与Boot sector的概念非常重要, 我们会在第十九章分别介绍,您在这里只要先对于(1)开机需要开机管理程序, 而(2)开机管理程序可以安装在 MBR 及 Boot Sector 两处 这两个概念有基本的认识即可!

UEFI识别GPT的开机流程

回到顶部
我们知道GPT可以提供到64bit的寻址,然后也能够使用较大的区块来处理开机管理程序。 但是 BIOS 其实不懂 GPT 耶!还得要通过 GPT 提供兼容模式才能够读写这个磁盘设备~ 而且BIOS仅为16位的程序,在与现阶段新的操作系统接轨方面有点弱掉了! 为了解决这个问题,因此就有了统一可延伸固件接口UEFI(Unified Extensible Firmware Interface) 的产生。
UEFI主要是要取代BIOS这个固件接口,因此我们也称UEFI为UEFI BIOS。 UEFI使用C程序语言,比起使用汇编语言的传统BIOS更容易开发! 因为使用C语言开发,可以在UEFI开机阶段就让系统识别TCP/IP协议而直接上网! 根本不需要进入操作系统!这让小型系统的开发充满各式各样的可能性!
基本上,传统BIOS与UEFI的差异可以用如下表格说明:
传统BIOS与UEFI的差异
传统BIOS与UEFI的差异
比较项目 传统 BIOS UEFI
使用程序语言 汇编语言 C 语言
硬件资源控制 使用中断 (IRQ) 管理
不可变的内存存取
不可变得输入/输出存取
使用驱动程序与协议
处理器运作环境 16位 CPU保护模式
扩充方式 通过 IRQ 连结 直接加载驱动程序
第三方厂商支持 较差 较佳且可支持多平台
图形化能力 较差 较佳
内建简化操作系统前环境 不支援 支援
传统的BIOS不同,UEFI简直就是一个低配版的操作系统~甚至于连主板上面的硬件资源的管理,也跟操作系统类似, 只需要加载驱动程序即可控制操作。同时由于程控得宜,一般来说,使用UEFI接口的主机,在开机的速度上要比BIOS快上许多! 因此很多人都觉得UEFI似乎可以发展成为一个很有用的操作系统~不过,关于这个,你无须担心未来除了 Linux 之外,还得要增加学一个 UEFI 的操作系统啦!为啥呢? UEFI当初在发展的时候,就制定一些控制在里头,包括硬件资源的管理使用轮询(polling)的方式来管理, 与BIOS直接了解CPU以中断的方式来管理比较, 这种 polling 的效率是稍微慢一些, 另外, UEFI并不能提供完整的快取功能,因此执行效率也没有办法提升。 由于加载所有的UEFI驱动程序之后, 系统会开启一个类似操作系统的shell环境,用户可以此环境中执行任意的UEFI应用程序,而且效果比MSDOS更好。
效果华丽但效能不佳,这个UEFI大多用来作为启动操作系统之前的硬件检测、开机管理、软件设定等目的,基本上是比较难的。 加载操作系统后,UEFI就会停止工作,并将系统交给操作系统,这与早期的BIOS差异不大。 比较特别的是,某些特定的环境下, UEFI程序是可以部份继续执行的,以协助某些操作系统无法找到特定设备时,该设备还是可以持续运作。
由于过去cracker经常藉由BIOS开机阶段来破坏系统,并取得系统的控制权,因此UEFI加入了一个所谓的安全启动(secure boot)机制, 这个机制代表着即将开机的操作系统必须要被UEFI所验证,否则就无法顺利开机! 微软用了很多这样的机制来管理硬件。 不过加入这个机制后,许多操作系统,包括Linux就很有可能无法顺利开机喔! 所以,可能得要将UEFI的secure boot功能关闭, 才能够顺利的进入Linux! (这一点让自由软件工作者相当感冒啦!) 与BIOS模式相比,虽然UEFI可以直接取得GPT分区表,不过最好依旧拥有BIOS boot的分区支持, 为了与windows兼容,并且提供其他第三方厂商所使用的UEFI应用程序储存的空间,必须要格式化一个vfat的文件系统, 大约提供512MB到1G左右的容量,以让其他UEFI执行较为方便。
由于UEFI已经克服了BIOS的1024磁柱的问题,因此你的开机管理程序与内核可以放置在磁盘开始的前2TB位置内即可! 加上之前提到的BIOS boot以及UEFI支持的分区, 基本上/boot目录几乎都是/dev/sda3之后的号码了! 这样开机还是没有问题的!所以要注意喔!与以前熟悉的分区状况不同, /boot不再是/dev/sda1!很有趣吧!

initroot编辑整理,转载请注明出处 www.initroot.com

100次点赞 100次阅读