回顾计算机的发展历史,并不是一开始就形成了现在的硬件+固件+操作系统这样的分工合作。在大型机时代(20世纪60年代),比如《人月神话》中曾经介绍过的IBM System/360,其硬件、操作系统是同时开发的,操作系统直接与硬件配合,不需要固件。

图1 IBM System/360

进入20世纪80年代,个人计算机(Personal Computer,简称PC)蓬勃发展,现代计算机进入PC时代,一直持续到至今。PC的流行,对人类的活动产生了巨大的影响,我们现在已经无法想象没有计算机的生活了。

PC之所以在短短几十年间在全球流行,其中一个最重要的因素是社会化的分工。与大型机、小型机时代不同,PC时代的每个公司只负责PC的一个部分。微软和Intel组成的Wintel联盟,不是包揽PC的所有部件。你可以使用Intel的CPU、微软的Windows系统、华硕的主板、Kingston的内存、七彩虹的显卡,再加上其他厂家的硬盘、键鼠、电源等,组成完整的计算机系统。

这种合作,我们现在称之为生态系统。在这个生态系统中,每一个参与者只负责其中一部分。大家遵循一定的标准,各司其职,把自己的部分做到最好,性价比做到最高。产生的结果,就是PC的成本越来越低,软件越来越丰富,整个生态系统生机盎然、欣欣向荣。

大量的硬件,带来的是各种各样的兼容性问题。纵观PC系统架构,下有五花八门的硬件,上有操作系统和复杂的应用软件。如何让这些纷纭复杂的软件运行在各种硬件上?答案是固件,也就是我们常说的Basic Input Output System(简称BIOS)。

也就是说,在软件和硬件之间增加固件层,由固件来管理硬件差异。这样可以大大减轻操作系统的负担,使之以一种统一的方式来掌控五花八门的硬件。

在目前的市场上,存在各种BIOS架构,包括UEFI、Coreboot、Uboot等。不同的BIOS架构,所实现的功能有所不同,不过必须提供操作系统所需要的接口。目前主流的BIOS架构是UEFI,特别是PC上,几乎成为事实上的标准。如图2给出了UEFI的启动流程。

图2 UEFI启动的7个阶段

UEFI的7个阶段分别为SEC(安全验证)、PEI(EFI前期初始化)、DXE(驱动执行环境)、BDS(启动设备选择)、TLS(操作系统加载)、RT(运行时)和AL(灾难恢复)。其中,前三个阶段是UEFI初始化阶段,DXE阶段加载了大量的硬件驱动,此后UEFI环境就准备好了。

BDS阶段负责选择启动设备,之后将会启动操作系统的OS Loader。由OS Loader去加载操作系统的Kernel,将操作系统启动起来。这些工作,都会在TLS阶段完成。

OS Loader会收集各种资源,包括内存的状况、ACPI的情况等,之后会触发ExitBootServices(),告知BIOS操作系统将接管权限。

OS Loader不是由BIOS提供的,是由操作系统提供的。在完成操作系统启动后,UEFI BIOS将不再有控制权,而是转接给操作系统。BIOS退出后,还会提供Runtime Services、SMI Handler等服务,供操作系统使用。

随着PC的发展,BIOS与操作系统早就密不可分了。BIOS负责初始化硬件,为操作系统提供各类硬件信息,并启动操作系统。完成启动工作后,BIOS交出控制权,并为操作系统提供Runtime Service等服务,以及ACPI、SMBIOS等Table。如图3所示,是一张显示操作系统和UEFI结构的宏观图。

图3 UEFI和操作系统软件架构

进入操作系统后,UEFI BIOS提供的接口包括三类:

1) UEFI Runtime ServicesUEFI运行时服务)

包括Variable Services、Real Time Clock Services、Status Code Services、Reset Services

等。

2) Version Information(版本信息)

包括UEFI Specfication Version(UEFI规范版本)、Firmware Vendor(固件厂商)、Firmware Revision(固件修订版本)等。

3)System Configuration Table(系统配置表)

包括ACPI Table、SMBIOS Table、HOB List、DXE Services Table、SAL System Table等。

虽然此时BIOS已经退出运行舞台,但仍旧在操作系统上发挥巨大的作用。比如按照ACPI标准提供的ACPI Table,它以对象化的方式描述计算机系统的硬件,报告给操作系统。我们最切身体会的关机、睡眠(休眠或待机)等电源事件,就是在ACPI Table控制下进行的。

操作系统的运行,特别是对硬件的掌控,依赖于UEFI BIOS提供的各类支持。对于操作系统内核开发而言,有必要深入了解UEFI架构以及其相应的开发知识。

想要了解更多关于UEFI的相关技术欢迎阅读《UEFI编程实践》

《UEFI编程实践》书中提供了33个UEFI应用和驱动示例,以及多个用来配合实验的Windows程序、Linux程序和嵌入式程序。涵盖了构建程序架构、调试方法、构建GUI、各种总线外设的访问、网络应用开发、UEFI驱动和Option ROM开发等内容,特别介绍了国产计算机下的UEFI开发,是偏实战操作的技术性书籍。

作者介绍:

罗 冰  物理隔离安全领域专家,主导开发过网络隔离卡、双网隔离机、国产隔离系统、单向光传输系统等各类安全产品,拥有十几项发明和实用新型专利。<br />致力于UEFI技术的研究、实践,以及相关产品的开发,在CSDN和知乎上设有“UEFI开发探索”专栏。译著有《现代X86汇编语言程序设计》《21世纪机器人》,目前就职于国内某网络安全公司,担任总工程师。

扫码关注【华章计算机】视频号

每天来听华章哥讲书

更多精彩回顾

书讯 | 11月书讯(上)| 拿下这些新书,赢在起跑线

书讯 | 11月书讯(下) | 拿下这些新书,赢在起跑线

资讯 | 什么是ETL?一文掌握ETL设计过程

书单 | 8本书助你零基础转行数据分析岗

干货 | 架构设计的新思路,《架构之道》读书笔记

收藏 | 终于有人把微服务讲明白了

上新 | 【新书速递】构建高质量软件:持续集成与持续交付系统实践

点击阅读全文购买

探秘主流BIOS架构:UEFI相关推荐

  1. 通过计算机的启动过程了解BIOS和UEFI

    本文属于学习笔记,如有侵权,请联系博主删除,如有错误之处也请多多指正,谢谢! 一.基本概念解释 说到计算机启动,绕不开的两个东西叫做BIOS和UEFI,BIOS 和 UEFI 都是计算机的固件类型.B ...

  2. BIOS 与 UEFI的区别

    BIOS 与 UEFI BIOS(Basic Input Output System,基本输入输出系统)诞生于1975年的CP/M计算机.起初,他作为一款先进的固件程序,在计算机系统中扮演着相当重要的 ...

  3. 【我所认知的BIOS】— uEFI AHCI Driver(8) — Pci.Read()

    [我所认知的BIOS]-> uEFI AHCI Driver(8) - Pci.Read() LightSeed 6/19/2014 社会一直在变.不晓得是不是社会变的太苦开,而我没变所以我反而 ...

  4. uefi下的开机顺序_科普贴:BIOS和UEFI的启动项

    先插一句话,现在很多人用UEFI BIOS这个称呼.这里为了区分:BIOS一律指传统BIOS, UEFI BIOS一律称呼为UEFI. UEFI下的BIOS设置,一律称为UEFI设置. 写这篇的原因 ...

  5. 【干货】BIOS、UEFI、MBR、GPT、GRUB 到底是什么意思?

    目录 01 前言 02 与操作系统启动相关的几个概念 2.1 BIOS 2.2 UEFI 2.3 MBR与GPT 2.4 GRUB 01 前言 在学习 Linux 系统启动原理之前,我们先了解下与操作 ...

  6. BIOS和UEFI的区别,系统安装引导以及MBR和GPT磁盘分区

    前言 安装系统是计算机专业的日经操作,然而就算你是身经百战,也可能会遇到各种各样棘手的问题,对系统的启动流程也是似懂非懂(俺也一样),每次碰到问题都会花去大量的时间去查询解决方案,最后很多时候都免不了 ...

  7. BIOS、UEFI、Boot Loader都是些什么

    BIOS.UEFI.Boot Loader都是些什么 文章目录 BIOS.UEFI.Boot Loader都是些什么 什么是BIOS 基本的输入输出是什么 自检程序"检"了什么 系 ...

  8. 解释Linux文件系统:Boot Loading, 磁盘分区,BIOS,UEFI和文件系统类型

    Boot loading,磁盘分区,分区表,BIOS,UEFI,文件系统类型等概念对我们来说所知甚少.我们经常遇到这些术语,但很少花费力气详细地了解这些术语和它们的含义.本文努力用最简单的方式填补这一 ...

  9. 【完结】总结12大CNN主流模型架构设计思想

    文章首发于微信公众号<有三AI> [完结]总结12大CNN主流模型架构设计思想 专栏<CNN模型解读>正式完结了,在这一个专栏中,我们给大家回顾了深度学习中的各类具有代表性的C ...

最新文章

  1. Kubernetes — MACVLAN CNI
  2. 科大星云诗社动态20210429
  3. 安装mavlink遇到的问题(future找不到)
  4. Linux学习笔记01
  5. Opencv——图像金字塔与图像尺寸缩放
  6. keil5建立工程步骤_5个步骤建立实践社区
  7. 物联网os_用于物联网的FireFox OS,NextCloud公告以及更多新闻
  8. 屏幕操作录制成gif图的技巧
  9. Excel表复制、取消工作表保护、解除冻结操作
  10. Oracle锁庞大大引见
  11. Matlab安装指南
  12. 宇宙简史——星光中有什么秘密?
  13. 华为云服务器销售话术技巧,云服务器销售话术
  14. 分布式丛林探险系列之 Redis 主从复制模式
  15. DevOps在证券互联网研发中的应用与实践
  16. Xavier法与何恺明法初始化权重的意义及原理
  17. [OHIF-Viewers]医疗数字阅片-医学影像-中间插播一下-es6-使用const加箭头函数声明函数相对于function声明函数有什么好处?...
  18. LOL自动走A和释放技能原理及安全防护
  19. c语言程序设计课程总结600字,2019年春季学期《C语言程序设计II》课程总结
  20. 使用 MediaExtractor 和 MediaMuxer API 解析和封装 mp4 文件

热门文章

  1. BinWalk安装和命令参数详解
  2. 基于OGRE的大规模森林场景可视化研究
  3. VMware vSphere 命令随记
  4. windows 10 开始菜单和cortana无法工作的问题
  5. Matlab吓人有一手啊,恶心。
  6. JAVA时间戳类Instant
  7. Mulval与Nessus联动
  8. 现在微商怎么做营销?
  9. 又一个大雷引发市场巨震?Silvergate或将跌落:成也加密败也加密?
  10. iOS关于App上线构建版本一直正在处理的解决方法