BIOS、UEFI、Boot Loader都是些什么

什么是BIOS

Basic Input Output System(基本输入输出系统)

其实就是一组保存着计算机最重要的基本输入输出的程序开机后自检程序系统自启动程序并固化到计算机内主板上的一个ROM芯片上的程序

基本的输入输出是什么

BIOS的终极目标:

“BIOS的最主要的功能:初始化硬件平台和提供硬件的软件抽象,引导操作系统启动。”

所以:

输入的是:硬件平台的信息

输出的是:硬件的软件抽象

然后将引导文件加载至内存引导操作系统启动

自检程序“检”了什么

每个硬件平台都需要发现IO总线,因为数据的传输离不开总线。

所谓的系统自检,就是Power On Self Test,也就是图中的POST过程。在传统BIOS的上电阶段,通过IO枚举发现总线,进入到标准描述的平台接口部分。

系统自启动了什么

自启动了操作系统呀~毕竟按下电源只是启动了BIOS程序。

此外,在传统BIOS程序中,还不支持文件系统,不像上图的Dell主板,可以手动的添加引导文件,在传统BIOS启动之后,BIOS会自动加载MBR的主引导记录,使操作系统“自行启动”

所以我们再看什么是BIOS

输入:围绕上图进行展开,左边部分刚好是硬件的初始化:CPU初始化、内存初始化……相当于是上面说的,输入的硬件平台信息。

自检:再经过中间部分的系统自检,控制台初始化、设备初始化、通过枚举发现总线并初始化。

输出&自启动:选择引导设备之后,通过BIOS将硬件平台的软件接口提供给OS Loader,以供操作系统运行使用。

BIOS的脉络就稍微有一些清楚了吧。

什么是UEFI BIOS

Unified Extensible Firmware Interface(统一可扩展固件接口)

由于安藤处理器芯片组的创新,64位架构的处理器已经不再适用传统BIOS的16位运行模式,英特尔将系统固件和操作系统之间的接口完全重新定义为一个可扩展的,标准化的固件接口规范。

UEFI名字听起来和BIOS相差较大,但是作为业界的新BIOS——UEFI BIOS,毕竟还是BIOS,所以它的主要目标就还是——初始化硬件,提供硬件的软件抽象,并引导操作系统启动

UEFI和BIOS的区别

效率方面:BIOS正是因为其闭源、接口混乱才导致其最终不适用于新架构的芯片,那时候刚好赶上开源的浪潮,UEFI开源且使用规定的标准接口,通过提供接口,也将大部分代码移步到了C代码,大大降低了开发难度,这也是其快速发展的根本原因。

性能方面:UEFI舍弃了硬件外部中断的低效方式,只保留了时钟中断,通过异步+事件来实现对外部设备的操作,性能因此得到极大的释放。

扩展性和兼容性:由于规范的模块化设计,在扩展功能时只需要动态链接其模块即可,扩展十分方便。而且传统BIOS必须运行在16位的指令模式下,寻址范围也十分有限,而UEFI BIOS支持64位的程序,兼容32位,这也是为什么Windows XP这么久了,稍微改改还可以安装在新设备上。

安全性:UEFI安装的驱动设备需要经过签名验证才可以,通过一定的加密机制进行验证,其安全性也非常的高。

其他:传统BIOS只支持容量不超过2TB的驱动器,原因是:按照常见的512Byte扇区,其分区表的单个分区的第13-16字节用来进行LBA寻址,也就是以扇区为单位进行寻址。

13-16总共4个字节,1Byte=8bit,这样也就是4*8=32位,总共就是2^32个单位空间,以扇区为单位进行寻址,也就是每次512Byte,也就是:

\[2^{32}*512=2^{41}B=2^{31}KB=2^{21}MB=2^{11}GB=2TB
\]

所以传统BIOS支持的最大容量的驱动器,不超过2TB。以硬件厂商1000:1024的计算方式,也就是2.2TB

\[2^{41}B/1000,000,000,000=2.2TB
\]

那么UEFI支持多大的呢?

采用类似的分区表,具体可以看[参考文章]。

UEFI支持64位的地址空间,所以其寻址偏移恰好为一个机器长度——64位,即8Byte,还是按照LBA寻址方式,按照上述计算:

\[2^{64}*512=2^{73}B=2^{13}EB=8ZB
\]

但是微软关方和一些其他资料都显示是18EB(按照硬件厂商1000:1024计算):

\[2^{64}B/10^{60}=18EB
\]

所以可以对微软官网的数据证伪

由于现在又由8512Byte扇区伪装一下,发展成了4k大小的扇区,所以上述计算还可以再乘8,即GPT最大分区容量可以是64ZB,而当前整个万维网的大小也不过1ZB

GPT分区的结构

既然说到了GPT分区的大小问题,那就顺便稍微说一说它的结构吧,如上图:

PMBRProtective MBR,就是当作MBR用,位置在LBA0,如果是传统引导,就从这个地方寻找引导文件,如果是UEFI引导,再从后面的GPT HDR寻找,GPT HDRGPT表头,位置在LBA1,记录其他表项的位置;

LBA2-LBA33总共32个分区表,记录对应分区的信息,比如起始地址和结束地址等,每个分区的信息用128Byte记录,也叫做分区表项,比较有意思的一点是,由于Windows只允许最多128个分区,所以GPT一般也就只设32个分区表。那这是为什么呢?

前面介绍,一个扇区一般是512Byte,按照微软的设定来,128个分区,也就需要128个分区表项来记录,一个分区表项128Byte,也就是总共

\[128*128=2^7*2^7=2^{14}
\]

32512Byte大小的扇区,是不是刚好:

\[32*512=2^5*2^9=2^{14}
\]

这里可能只做了解即可。

至于后面的蓝色区域,对应之后,LBA-1GPT HDR的备份表,LBA-2 - LBA-33是分区表的备份表,如果前面的数据发生错误,就从后面恢复就好啦~

中间的LBA34-LBA-34也就是除去表头、表项和备份表等信息的分区内容啦

UEFI与硬件初始化

UEFI纯粹地是一个接口规范

它不会具体涉及平台固件是如何实现的

UEFI建立在被称为平台初始化(Platform Initialization,简称PI)标准的框架之上。

PI是关于UEFI具体如何实现的规范

SEC安全验证,初始化cpucpu内部资源,使cache作为ram提供堆栈运行C代码(CAR——Cache As Ram

PEI阶段初始化内存,并将需要传递的信息传递给DXE

DXE驱动执行环境,内存已经可以完全被使用,初始化核心芯片,并将控制权转交给UEFI接口

BDS引导设备选择,负责初始化所有启动OS所需的设备,负责执行所有符合UEFI驱动模型的驱动。

选择完引导设备,就加载OS loader运行OS

OS启动后,系统的控制权从UEFI转交给OS loaderUEFI占用的资源被回收到OS loader,只保留UEFI运行是服务。

其实再统观一下上面的流程,是不是就变成了:基本输入>>>PI>>>UEFI>>>基本输出

这个过程是不是又像BIOS了?毕竟UEFI还是用作BIOS的。

如果还是觉得UEFIBIOS是两回事,那么可以换种解读:

Rom Stage:一开始运行在Rom中,初始化Cache作为Ram运行,从而有了初步的C环境,运行C代码。

Ram Stage:初始化一定的硬件之后,BIOS程序进入到Ram中,继续初始化芯片组、主板等硬件。

Find something to boot:最后找到启动设备,把控制权交给操作系统内核,开始操作系统的时代。

什么是Boot Loader

Boot Loader是在操作系统内核运行前执行的一小段程序,执行的工作听起来和BIOS很像:初始化硬件,和引导系统,相当于UEFI启动过程中的PEI初始化硬件、DXE识别启动设备,BDS把权限交给启动加载器,引导内核。

对比一下UEFIBoot Loader的启动方式:

再分析Boot Loader的启动过程:

首先硬件设备初始化。为加载 Boot Loaderstage2 准备 RAM 空间。拷贝 Boot Loaderstage2RAM 空间中。设置好堆栈。跳转到 stage2C 入口点。

初始化本阶段要使用到的硬件设备。检测系统内存映射(memory map)。将kernel 映像和根文件系统映像从 flash 上读到 RAM 空间中。为内核设置启动参数。调用内核。

PS:有的Boot Loader可能只有一个过程,上述为两个阶段的类型。

几个问题:

  1. BIOS为什么固化到ROM芯片上?

    因为掉电不丢失

  2. 只读存储器的话,又不能作修改,还有界面干什么?

    要作修改,修改内容在CMOS

  3. 现在的BIOS固化到哪了?

    ROM->PROM->EPROM->EEPROM->FLASH

    • 一开始是在ROM上,但是只能检验,不能修改,十分的不方便,所以就转到了PROM

    • PROM可编程ROM,但是写入后也不能改,

    • 然后就是EPROM,可擦除可编程ROM,但是人们又觉得不方便,

    • 于是又有了EEPROM,电可擦除可编程ROM,而且双电压可防毒。

    • Flash闪存,更方便,只要用专用程序即可修改,

bios

为什么要有BIOS?BIOS那些恼人的小问题集锦(一)

UEFI与硬件初始化

统一可扩展固件接口

UEFI背后的历史

UEFI和BIOS的区别优缺点详解

MBR分区表为什么最大只能识别2TB硬盘容量

MBR为什么最大只能用2TB

UEFI和UEFI论坛

笔记三(UEFI详解)

UEFI 引导与 传统BIOS 引导在原理上有什么区别?芯片公司在其中扮演什么角色?

一个UEFI引导程序的实现

ROM、PROM、EPROM、EEPROM、RAM、SRAM、DRAM的区别

Windows and GPT FAQ

GUID Partition Table (GPT)

GPT磁盘分区的结构原理

《gpt_white_paper_1_1》

PS : 个人理解,学术慎用!

BIOS、UEFI、Boot Loader都是些什么的更多相关文章

  1. MIT 6.828 JOS学习笔记7. Lab 1 Part 2.2: The Boot Loader

    Lab 1 Part 2 The Boot Loader Loading the Kernel 我们现在可以进一步的讨论一下boot loader中的C语言的部分,即boot/main.c.但是在我们 ...

  2. 嵌入式系统 Boot Loader 技术内幕

    转载:http://www.ibm.com/developerworks/cn/linux/l-btloader/index.html   1. 引言 在专用的嵌入式板子运行 GNU/Linux 系统 ...

  3. 【转】嵌入式系统 Boot Loader 技术内幕,带你完全了解Boot Loader

    在专用的嵌入式板子运行 GNU/Linux 系统已经变得越来越流行.一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次: 1. 引导加载程序.包括固化在固件(firmware)中的 boo ...

  4. 嵌入式系统 Boot Loader 技术内幕【转】

    本文转载自:https://www.ibm.com/developerworks/cn/linux/l-btloader/ 本文详细地介绍了基于嵌入式系统中的 OS 启动加载程序 ―― Boot Lo ...

  5. BOOT BIOS UEFI

    1. 什么是BOOT? BOOT其实是你按开机键之后,在电脑微软操作系统运行之前就自动运行的一段小程序.表象上就是windows引导画面之前那些黑屏蓝屏的英文那个阶段就是BOOT了.通过这段小程序,它 ...

  6. Linux学习-Boot Loader: Grub2

    boot loader 的两个 stage 在 BIOS 读完信息后,接下来就是会到第一个开机装置 的 MBR 去读取 boot loader 了.这个 boot loader 可以具有选单功能.直接 ...

  7. 【转载】How to develop your own Boot Loader【怎么样开发自己的bootloader】

    How to develop your own Boot Loader 怎么样开发自己的bootloader Table of content[目录] 1. Who may be interested ...

  8. 《xv6 Appendices: PC Hardware and Boot loader》学习笔记

    MIT 6.828 Lecture 2的preparation要求阅读<xv6 book>的附录部分,附录包括"PC Hardware"和"The Boot ...

  9. MIT 6.828 JOS学习笔记4. Lab 1 Part 2.1: The Boot Loader

    Part 2: The Boot Loader 对于PC来说,软盘,硬盘都可以被划分为一个个大小为512字节的区域,叫做扇区.一个扇区是一次磁盘操作的最小粒度.每一次读取或者写入操作都必须是一个或多个 ...

随机推荐

  1. inkscope完整安装配置

    准备centos7基础系统 首先安装基础系统centos7 在安装选项那里选择base web server ,选择其他的也可以,选择mini安装会缺很多常用的软件包,后续需要一个个安装比较麻烦 关闭 ...

  2. sql实现通过父级id查询所有的子集

    通过sql实现传入父级id查询出所有的子集 最近刚好有个业务需要这样实现个功能,就是在点击查询列表详情的时候只会传入父级id,而详情得渲染出所有子集,那么做法有很多,可以直接通过代码递归查询去实现, ...

  3. Java中List,Set,Map区别

    在Java开发面试中,面试官最常问到的就是Java集合,免不了要让面试者说出之间的区别,下面博主就对其做了总结. 1.集合与数组的区别 长度区别:数组是固定长度,集合长度可变: 内容区别:数组可以是基 ...

  4. SQL SERVER 数据库自动备份及定期删除设置步骤

    现在任何的软件都离不了一个数据库,数据的利用价值越来越大,为了避免数据宕机造成的数据丢失情况的产生,定期对数据库进行备份是必须要做的工作,下面将介绍SQL Server自带的数据库备份方法,希望可以帮 ...

  5. Java解释单链表中的头插法以及尾插法

    单链表属于数据结构中的一种基本结构,是一种线性结构,在此使用Java对其中的头插法以及尾插法进行解释. 首先定义好链表中的节点类: 其中,data代表节点所存放的数据,next代表指向下一节点 对于单 ...

  6. Jrebel & Xrebel 在线激活方法 (亲测可用)

    一开始用eclipse的时候虽然这是一个狂吃内存的家伙,但是调试代码是真的舒服,修改过的代码可以不用重启热加载,后来转idea,虽然idea很完美但是也有不足的地方,比如代码调试就不能热加载. 还好有 ...

  7. Tomcat AJP 文件包含漏洞复现(CVE-2020-1938)

    漏洞原理 Tomcat配置了两个Connecto,它们分别是HTTP和AJP. HTTP默认端口为8080,处理http请求:AJP默认端口8009,用于处理 AJP 协议的请求. AJP比http更 ...

  8. 企业级工作流解决方案(八)--微服务Tcp消息传输模型之服务端处理

    服务端启动 服务端启动主要做几件事情,1. 从配置文件读取服务配置(主要是服务监听端口和编解码配置),2. 注册编解码器工厂,3. 启动dotnetty监听端口,4. 读取配置文件,解析全局消息处理模 ...

  9. 教你用Camtasia制作精美片头

    大家都知道在视频播放中,如果有一个令人印象深刻的精彩开头,整个视频的内容都能因此得到不少升华.所以有一个好的片头对于视频的制作来说十分重要.今天我们就来讲一下用Camtasia制作片头的方法. 首先, ...

  10. mac用户怎么保护自己的隐私安全?

    使用过Windows系统的小伙伴们应该都知道,Windows系统下有360电脑管家和腾讯电脑管家等几款著名清理软件,专门用于清理电脑缓存.垃圾文件以及清除浏览痕迹,这对于Windows用户是大大节省了 ...