共计 7172 个字符,预计需要花费 18 分钟才能阅读完成。
title: 操作系统_01_BIOS、UEFI等基础概念 date: 2022-04-13 14:54:54.0 updated: 2022-05-05 22:33:12.703 url: /archives/os01 categories:
- 操作系统 tags:
- BIOS
- 操作系统
- UEFI
- MBR
1 概述
本文只是简单介绍一些基本知识,包括BIOS、UEFI、MBR、GPT、GRUB等。
2 BIOS/CMOS
2.1 BIOS和CMOS的基本概念和区别
BlOS(Basic Input Output System)从字义上称为“基本输出输入系统”,专门负责系统硬件各种参数设定,本质上是“程序”,也就是一组“代码”。
BIOS芯片,是特指存储BIOS程序的一块特定的ROM芯片。ROM,只读存储器,一般写入后只能读,不能更改,但也有可擦除只读存储器。
ROM芯片是一个实体物品,本质就是一个储存器,是主板上一颗小小的快闪EEPROM内存模块板中的长方形或正方形芯片,这一类芯片可以存储BIOS程序,也可以存储其它程序、代码。
CMOS通常读作C-mo-se(中文发音“瑟模室”),是电脑主板上的一块可读写的RAM芯片,用来保存当前系统的硬件配置情况和用户对某些参数的设定。CMOS芯片由主板上的充电电池供电,即使系统断电,参数也不会丢失。CMOS芯片只有保存数据的功能,而对CMOS中各项参数的修改要通过BIOS的设定程序来实现。
总结:BIOS 是程序,存放在ROM 芯片上,而CMOS 是芯片,而且是可读写的RAM 芯片,用来存放系统硬件配置情况以及参数等,BIOS 会对CMOS 操作。
2.2 BIOS功能
BIOS管理功能包括:
- POST上电自检 :微机接通电源后,系统首先由(Power On Self Test,上电自检)程序来对内部各个设备进行检查。通常完整的POST自检将包括对CPU,640K基本内存,1M以上的扩展内存,ROM,主板,CMOS存储器,串并口,显示卡,软硬盘子系统及键盘进行测试,一旦在自检中发现问题,系统将给出提示信息或鸣笛警告。
- BIOS系统启动自举程序 :系统完成POST自检后,ROM BIOS就首先按照系统CMOS设置中保存的启动顺序搜索软硬盘驱动器及CD-ROM,网络服务器等有效地启动驱动器,读入操作系统引导记录,然后将系统控制权交给引导记录,并由引导记录来完成系统的顺序启动。
- BIOS中断服务程序 实质上是微机系统中软件与硬件之间的一个可编程接口,主要用于程序软件功能与微机硬件之间对接。例如,WINDOWS98对软驱,光驱,硬盘等管理,中断的设置等服务、程序。
- BIOS系统设置程序 :微机部件配置记录是放在一块可写的CMOS RAM芯片中的,主要保存着系统的基本情况,CPU特性,软硬盘驱动器等部件的信息。在BIOS ROM 芯片中装有“系统设置程序”,主要来设置CMOS RAM中的各项参数。这个程序在开机时按某个键就可进入设置状态,并提供良好的界面。(可以设置CMOS参数)
2.3 BIOS启动流程
- POST自检:系统加电后,BIOS程序首先检查,计算机硬件能否满足运行的基本条件,这叫做”硬件自检”(Power-On Self-Test),缩写为POST。如果硬件出现问题,主板会发出不同含义的蜂鸣,启动中止。如果没有问题,屏幕就会显示出CPU、内存、硬盘等信息。
- 初始化:系统完成POST后读取CMOS RAM中的系统参数等进行初始化,包括创建中断向量、设置寄存器、对一些外部设备进行初始化和检测等,其中很重要的一部分是BIOS设置,主要是对硬件设置的一些参数,当计算机启动时会读取这些参数,并和实际硬件设置进行比较,如果不符合,会影响系统的启动。
- 寻找下一阶段启动程序:硬件自检完成后,BIOS把控制权转交给下一阶段的启动程序。这时,BIOS需要知道,”下一阶段的启动程序”具体存放在哪一个设备。也就是说,BIOS需要有一个外部储存设备的排序,排在前面的设备就是优先转交控制权的设备。这种排序叫做”启动顺序”(Boot Sequence)。打开BIOS的操作界面,里面有一项就是”设定启动顺序”。
- 按照启动顺序,寻找设备引导记录:BIOS按照”启动顺序”, BIOS先从启动顺序设置的设备的开始扇区读取引导记录,如果没有找到,可能会跳过该设备,继续寻找下一个设备,如果最后也没找到则会在显示器上显示没有引导设备,如果找到引导记录会把计算机的控制权转给引导记录,由引导记录把操作系统装入计算机,在计算机启动成功后,BIOS的这部分任务就完成了。
3 UEFI/BIOS
3.1 UEFI基本概念
UEFI一般指统一可扩展固件接口。 统一可扩展固件接口(英语:Unified Extensible Firmware Interface,缩写UEFI)是一种个人电脑系统规格,用来定义操作系统与系统固件之间的软件界面,作为BIOS的替代方案。
总结:UEFI就是BIOS的替代方案,提到BIOS也可以指传统BIOS,也有UEFI BIOS的说法。以下说的BIOS指传统BIOS。
例如:可以在windows win+R输入msinfo32查看系统信息,可以看到BIOS模式,本机就是UEFI模式启动的。
3.2 BIOS和UEFI共同点
PC的启动引导流程本质上没有改变,BIOS和UEFI 启动本身都是要经历以下三个步骤:
- ROM Stage :在这个阶段没有内存,需要在ROM上运行代码。这时因为没有内存,没有C语言运行需要的栈空间,开始往往是汇编语言,直接在ROM空间上运行。在找到个临时空间(Cache空间用作RAM,Cache As Ram, CAR)后,C语言终于可以粉墨登场了,后期用C语言初始化内存和为这个目的需要做的一切服务。
- RAM Stage :在经过ROM阶段的困难情况后,我们终于有了可以大展拳脚的内存,很多额外需要大内存的东西可以开始运行了。在这时我们开始进行初始化芯片组、CPU、主板模块等等核心过程。
- Find something to boot Stage: 终于要进入正题了,需要启动,我们找到启动设备。就要枚举设备,发现启动设备,并把启动设备之前需要依赖的节点统统打通。然后开始移交工作,Windows或者Linux的时代开始。
3.3 BIOS和UEFI不同点
那UEFI为什么能取代传统BIOS呢?就是因为标准接口、开放统一、开源。
UEFI扫除了传统****BIOS 割裂的生态 ,打通了PC固件之间的鸿沟,并提供统一的接口给操作系统,而不关心操作系统是什么;它能够更好的完成PC固件的终极目的:初始化硬件和提供硬件的软件抽象,和启动操作系统。如果说有什么东西帮助UEFI打败了传统BIOS,那这些东西就是:标准接口、开放统一和开源了 。
传统BIOS由IBM主导,当时由于激烈的商战导致接口无法统一,要写个驱动,让它不同BIOS厂商那里都能跑是不可能的。
而UEFI是Intel推动,一开始就将标准公开,并拉上了微软,强势统一了江湖。在近20年的深耕下,统一了固件启动阶段基础框架Spec: Pl Spec与操作系统的接口Spec: UEFI Spec,并将抽象硬件的原语性Spec: ACPI Spec也拉入这个大家庭,都变成UEFI Forum的一份子。现在只要符合UEFI driver model的驱动都可以在各个BIOS上运行,打通了各个BIOS厂商之间的栅栏;与此同时,符合UEFI标准的操作系统都可以流畅的在各种主板上运行,无论是Windows,还是Linux各种发行版,甚至是Android。实际上,PC生态圈的繁荣,和UEFI的推广和被广泛接受是分不开的。
UEFI采用PE/COFF格式作为UEFI驱动和应用的标准。
3.4 UEFI架构
TPM CLIEN文章中的UEFI架构:
可以看到,UEFFI服务包含引导时服务和运行时服务。
3.5 UEFI实现
3.5.1 SEC,PEI和DXE
SEC : PI平台启动的安全(Security,简称SEC)阶段必须处理不同类型的平台重置(Reset)事件。 SEC还是系统的信任根,它为系统上进一步启动固件提供了控制点(Control Point)。 SEC阶段的优点在于:它可以提供一个锚点,基于这个锚点来构建一个已验证的引导过程。一旦临时存储器可用,SEC必须找到引导进程的下一个阶段:EFI预初始化(Pre-EFI Initialization简称PEI)阶段,并将控制权限移交。当然,根据PEI代码的位置以及平台策略,PEI代码必须在执行之前经过认证。
PEI : PEI阶段的目标是为PEI模块的执行搭建合适的环境。 因此,在PEI阶段初期,PEI调度器就已启动。 PEI模块通常对设备和芯片组的底层平台进行初始化,例如串行端口和内存的初始化。 该阶段的的另一个职责是搜索平台信息,在切换块(hand-off blocks,简称HOB)中为此信息创建数据库,并将数据库传递给平台引导的下一阶段:DXE阶段。 和上一阶段相同的是,PEI模块也必须在运行模块之前进行验证。 一般来说,PEI模块是平台的核心固件的一部分,并且对于特定平台模型,可以认为这个模块是静态且可信的。 不过,在PI规范中没有关于PEI模块位置的要求,因此可以存在其中一些或所有PEI模块将需要被认证以维持平台完整性的平台。有些平台为了维持其完整性,会对所有的PEI模块进行验证。
DXE : 当PEI阶段找到并开始执行DXE的初始化程序加载时,标志着引导程序进入了PI规范要求的最终阶段。DXE阶段通过HOB来查询平台的相关信息,并为驱动程序搭建一个更加完整的环境。 DXE调度程序负责查找和启动DXE驱动程序,这些驱动程序可能有很多来源。但PI代码和UEFI核心仅来自系统板制造商,并且不能由第三方任意扩展。平台制造商必须为符合PI规范而且采用了UEFI服务的固件负责,保障其从生产到交付后的真实性和安全性。 为了保持平台完整性,对固件的更改必须处于平台制造商的控制监督之下。在不同的平台下,这一控制的实现或许会有所不同,但不管是什么平台,都必须实现散列和加密认证等方式,否则其安全性无法得以真正保障。 在较新版本的UEFI规范中,都提供了一些用于固件更新的工具。 对安全引导来说,固件更新必须是受控的。固件受控对于TCG测量引导(TCG Measured Boot)也同样必要。
3.5.2 BDS,OS loader和RT
BDS:在DXE结束后,BDS得以运行。BDS (Boot Device Select ),顾名思义,就是发现引导设备(全部或者部分), 并作出选择(用户选择或者根据设定)。它负责初始化所有启动OS所需的设备(输入、输出和存储)。在更高层面上讲,它负责执行所有符合UEFI驱动模型(UEFI driver model)的驱动。这是一个发现并一个个连接的过程。譬如,首先发现PCI root,接着发现PCI bus,在PCI bus下发现SATA controller和USB controller……一个个启动设备被发现,其设备路径(device path)也被连接起来。在万事俱备后,一个界面被显示出来(嵌入式系统上可以没有),供用户进行设置和选择启动设备,这就是大家熟悉的BIOS界面。
RT : 在用户选择或者用预设的设备被挑出来后,BDS加载OS loader,而OS loader负责找到并运行OS。在OS启动后,所有的启动时服务都不可用了,只有运行时服务得以留存。
4 MBR/GPT
4.1 MBR
4.1.1 MBR介绍
MBR(Master Boot Record)分区分析:
MBR的意思是“主引导记录”,它有自己的启动器,也就是启动代码,一旦启动代码被破坏,系统就没法启动,只有通过修复才能启动系统。最大支持2TB容量,在容量方面存在着极大的瓶颈,那么GPT在今后的发展就会越来越占优势,MBR也会逐渐被GPT取代。
4.1.2 MBR作用
接着2.3 BIOS启动流程,BIOS按照”启动顺序”,把控制权转交给排在第一位的储存设备。
这时,计算机读取该设备的第一个扇区,也就是读取最前面的512个字节。如果这512个字节的最后两个字节是0x55和0xAA,表明这个设备可以用于启动;如果不是,表明设备不能用于启动,控制权于是被转交给”启动顺序”中的下一个设备。
这最前面的512 个字节,就叫做” 主引导记录” (Master boot record ,缩写为MBR ) 。
“主引导记录”只有512个字节,放不了太多东西。它的主要作用是,告诉计算机到硬盘的哪一个位置去找操作系统 。
主引导记录由三个部分组成:
(1) 第1-446字节:调用操作系统的机器码。
(2) 第447-510字节:分区表(Partition table)。
(3) 第511-512字节:主引导记录签名(0x55和0xAA)。
因为采用MBR这种方式的,一个硬盘最多只能分四个一级分区,又叫做”主分区”,并且4个主分区里,只有一个是激活的,如果还要更多的分区,需要进行扩展分区。因此当计算机的控制权就要转交给硬盘的某个分区了,又分成三种情况:
1 、情况A 、卷引导记录。
四个主分区里面,只有一个是激活的。计算机会读取激活分区的第一个扇区,叫做”卷引导记录”(Volume boot record,缩写为VBR)。
“卷引导记录”的主要作用是,告诉计算机,操作系统在这个分区里的位置。然后,计算机就会加载操作系统了。
2 、情况B 、扩展分区和逻辑分区。
随着硬盘越来越大,四个主分区已经不够了,需要更多的分区。但是,分区表只有四项,因此规定有且仅有一个区可以被定义成”扩展分区”(Extended partition)。所谓”扩展分区”,就是指这个区里面又分成多个区。这种分区里面的分区,就叫做”逻辑分区”(logical partition)。
计算机先读取扩展分区的第一个扇区,叫做”扩展引导记录”(Extended boot record,缩写为EBR)。它里面也包含一张64字节的分区表,但是最多只有两项(也就是两个逻辑分区)。
计算机接着读取第二个逻辑分区的第一个扇区,再从里面的分区表中找到第三个逻辑分区的位置,以此类推,直到某个逻辑分区的分区表只包含它自身为止(即只有一个分区项)。因此,扩展分区可以包含无数个逻辑分区。
但是,似乎很少通过这种方式启动操作系统。如果操作系统确实安装在扩展分区,一般采用下一种方式启动。
3、情况C、启动管理器
在这种情况下,计算机读取”主引导记录”前面446字节的机器码之后,不再把控制权转交给某一个分区,而是运行事先安装的”启动管理器”(boot loader),由用户选择启动哪一个操作系统。
Linux环境中,目前最流行的启动管理器是GRUB。
以下是Linux操作系统启动的全过程。
4.2 GPT
GPT(GUID Partition Table)分区分析:
GPT意为GUID分区表,这是一个正逐渐取代MBR的新标准,它由UEFI辅住而形成的,这样就有了UEFI用于取代老旧的BIOS,而GPT则取代老旧的MBR。这个标准没有MBR的那些限制。磁盘驱动器容量可以大得多,大到操作系统和文件系统都没法支持。它同时还支持几乎无限个分区数量,限制只在于操作系统,Windows支持最多128个GPT分区。通过UEFI,所有的64位的win0,win8,win7和Vista,以及所对应的服务器都能从GPT启动。
4.3 MBR和GPT区别
1、MBR的局限性,它是存在于驱动器开始部分的一个特殊的启动扇区。这个扇区包含了已安装的操作系统的启动加载器和驱动器的逻辑分区信息。所谓启动加载器,是一小段代码,用于加载驱动器上其他分区上更大的加载器。如果你安装了Windows,Windows启动加载器的初始信息就放在这个区域里——如果MBR的信息被覆盖导致Windows不能启动,你就需要使用Windows的MBR修复功能来使其恢复正常。如果你安装了Linux,则位于MBR里的通常会是GRUB加载器;
2、MBR支持最大2TB磁盘,它无法处理大于2TB容量的磁盘。MBR还只支持最多4个主分区——如果你想要更多分区,你需要创建所谓【扩展分区】,并在其中创建逻辑分区;
3、GPT意为GUID分区表。(GUID意为全局唯一标识符)。这是一个正逐渐取代MBR的新标准,它和UEFI相辅相成——UEFI用于取代老旧的BIOS,而GPT则取代老旧的MBR。之所以叫做【GUID分区表】,是因为你的驱动器上的每个分区都有一个全局唯一的标识符(globally unique identifier,GUID)——这是一个随机生成的字符串,可以保证为地球上的每一个GPT分区都分配完全唯一的标识符;
5 GRUB
GNU GRUB(GRand Unified Bootloader简称“GRUB”)是一个来自GNU项目的多操作系统启动程序。GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。
GRUB加载流程:
当计算机加电自检后,ROM BIOS加载MBR(主引导扇区,即硬盘第一扇区)中的代码到内存中,这个扇区一共512字节,前446字节内容存放grub(bootloader)的关键引导程序,接着64字节放置硬盘分区表DPT(Disk Partition Table)。当BIOS把引导程序加载到内存后就把控制权交给grub,而后grub的剩余代码将完成其它代码的加载和搬移以及文件系统初始化查找等工作,最终加载内核映像文件,从而把控制权交给真正的内核运行。