UEFI架构

2023-05-16

UEFI架构

UEFI提供系统化的标准方法,加载驱动并管理他们之间的交互。

前言:感谢uefi blog

UEFI 提供了一个标准接口,以便在硬件发生变更时固件能提供足够信息而保证操作系统不受影响。它包含有芯片组和外设芯片驱动程序,并通过系统表提供引导时服务和运行时服务。

图一中展示了依赖于UEFI所提供的服务来工作的操作系统装载器(即 EFI OS Loader) 是如何启动操作系统内核的。其他工业标准接口,如ACPI和SMBIOS等,和UEFI也是并行不悖的。

 

UEFI提供了一个有序的方法来加载驱动程序和处理它们之间的相互依赖性。当必要的驱动程序被加载后,引导管理器或调度器会尝试(查询)一系列预配置好的引导路径或引导设备。在进行该操作时,一个调用了UEFI引导时服务的文件会被加载和执行。这个文件的加载操作是确保安全的一个重要支撑点,如果你看过我们以前的文章,就会反应过来,它就是——安全引导(Secure Boot)。

如果引导失败,会返回到UEFI引导管理器对此进行处理。但我们,一旦引导程序试图执行退出UEFI引导时环境的OS引导加载程序,那这个退出的引导时环境不能再次进入(re-entered),如图二所示。

 

服务

1。引导时服务

下表显示了UEFI应用程序可用的引导时服务类别。其中最重要的是以映像处理为主的服务,因为它是加载和执行模块的必由之路。

 

2。运行时服务

下表展示了在UEFI环境中可用的运行时服务类别。这些调用(calls)可以修改易失性数据,非易失性数据和实时时钟设置,从而改变平台的状态。平台状态的控制则是平台安全性方面的另一个重要领域。

 

UEFI的早期版本(如UEFI2.0)几乎不提供安全服务。比如:不提供保存平台数据的安全方法(保证只有数据的创建者可以进行数据的修改或删除操作);没有提供基本的身份验证工具,如散列或解密功能。问题的发现为增强UEFI环境安全性指明了研究方向,一个涉及增强UEFI安全能力(安全启动),另一个涉及测量和记录平台状态(可信计算)。

基础实现

首先来看一个小问题:implement,都知道是实现的意思,那究竟什么算实现,何种程度可以称之为实现呢?我们首先来理解这个词,这样会对后面的内容有所帮助。以下内容来自维基百科:在计算机科学中,实现是作为程序,软件组件或通过计算机编程和部署的其他计算机系统的技术规范或算法的实现。 对于给定的规范或标准可能存在许多实现。 例如,web浏览器包含万维网联盟推荐的规范的实现,软件开发工具包含编程语言的实现。或许看完这段你会有所理解,简言之:实现是且仅指规范的软件实现。接下来,我们开始讲针对于UEFI规范的实现。

尽管前面我们大讲UEFI各个方面,实际上,UEFI建立在被称为平台初始化(Platform Initialization,简称PI)标准的框架之上。PI标准为前期硬件初始化提供了标准流程和架构。此处我们讨论PI安全问题中与UEFI相关的方面。

按照UEFI设计者们的想法,UEFI应当可以从系统中的任意位置发现和运行文件(这是老旧的BIOS无法做到的)。 以下是这一特性如何实现的功能概述,以及在引导过程中,文件加载背后潜藏的安全风险。

1。SEC,PEI和DXE

PI规范允许基于UEFI的系统遵循标准固件架构。 这种系统的引导过程包括一系列阶段。 每个阶段既有自己独特的安全优势,也包含着不同的风险。

PI平台启动的安全(Security,简称SEC)阶段必须处理不同类型的平台重置(Reset)事件。 SEC还是系统的信任根,它为系统上进一步启动固件提供了控制点(Control Point)。 SEC阶段的优点在于:它可以提供一个锚点,基于这个锚点来构建一个已验证的引导过程。一旦临时存储器可用,SEC必须找到引导进程的下一个阶段:EFI预初始化(Pre-EFI Initialization简称PEI)阶段,并将控制权限移交。当然,根据PEI代码的位置以及平台策略,PEI代码必须在执行之前经过认证。

PEI阶段的目标是为PEI模块的执行搭建合适的环境。 因此,在PEI阶段初期,PEI调度器就已启动。 PEI模块通常对设备和芯片组的底层平台进行初始化,例如串行端口和内存的初始化。 该阶段的的另一个职责是搜索平台信息,在切换块(hand-off blocks,简称HOB)中为此信息创建数据库,并将数据库传递给平台引导的下一阶段:DXE阶段。 和上一阶段相同的是,PEI模块也必须在运行模块之前进行验证。 一般来说,PEI模块是平台的核心固件的一部分,并且对于特定平台模型,可以认为这个模块是静态且可信的。 不过,在PI规范中没有关于PEI模块位置的要求,因此可以存在其中一些或所有PEI模块将需要被认证以维持平台完整性的平台。有些平台为了维持其完整性,会对所有的PEI模块进行验证。

当PEI阶段找到并开始执行DXE的初始化程序加载时,标志着引导程序进入了PI规范要求的最终阶段。DXE阶段通过HOB来查询平台的相关信息,并为驱动程序搭建一个更加完整的环境。 DXE调度程序负责查找和启动DXE驱动程序,这些驱动程序可能有很多来源。但PI代码和UEFI核心仅来自系统板制造商,并且不能由第三方任意扩展。平台制造商必须为符合PI规范而且采用了UEFI服务的固件负责,保障其从生产到交付后的真实性和安全性。 为了保持平台完整性,对固件的更改必须处于平台制造商的控制监督之下。在不同的平台下,这一控制的实现或许会有所不同,但不管是什么平台,都必须实现散列和加密认证等方式,否则其安全性无法得以真正保障。 在较新版本的UEFI规范(从哪一版开始?)中,都提供了一些用于固件更新的工具。 对安全引导来说,固件更新必须是受控的(如何实现这一要求在本公众号的前几期文章有讲到,看过的读者不妨回忆一下)。固件受控对于TCG测量引导(TCG Measured Boot)也同样必要。

科普几个名词,可信计算组(Trusted Computing Group,简称TCG),与其相关的标准名字很简单,就叫TCG标准,该标准中定义了这样一个名词:受信操作的核心根(Core Root of Trust for Measurement,简称CRTM)。 实现CRTM的一种方法是使用静态CRTM(Static CRTM,S-CRTM),它是位于系统附带的闪存部分中的核心平台固件。 S-CRTM负责检测在S-CRTM之后执行的任何代码。 不要认为它与安全引导的职责是相同的,测量引导仅提供所有运行过的固件模块的记录,并且不提供有关固件模块完整性的任何判断,简言之就是:只记录,不负责。

2、BDS,OS loader和RT

 

在DXE结束后,BDS得以运行。BDS(Boot Device Select),顾名思义,就是发现引导设备(全部或者部分),并作出选择(用户选择或者根据设定)。它负责初始化所有启动OS所需的设备(输入、输出和存储)。在更高层面上讲,它负责执行所有符合UEFI驱动模型(UEFI driver model)的驱动。这是一个发现并一个个连接的过程。譬如,首先发现PCI root,接着发现PCI bus,在PCI bus下发现SATA controller和USB controller。。。一个个启动设备被发现,其设备路径(device path)也被连接起来。在万事俱备后,一个界面被显示出来(嵌入式系统上可以没有),供用户进行设置和选择启动设备,这就是大家熟悉的BIOS界面。

在用户选择或者用预设的设备被挑出来后,BDS加载OS loader,而OS loader负责找到并运行OS。在OS启动后,所有的启动时服务都不可用了,只有运行时服务得以留存

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UEFI架构 的相关文章

  • HP服务器ile进系统,HP GEN10服务器UEFI安装Windows Sverver 2012 R2教程

    1 操作系统 xff1a Windows Server 2012 R2 VL with Update x64 DVD Chinese Simplified xff0c MSDN下载地址 xff1a ed2k file cn windows
  • 详写 UEFI & BIOS 安装 Arch Linux

    Arch Linux官方安装向导 xff1a https wiki archlinux org index php Installation guide 文章目录 1 准备2 VirtualBox 打开 EFI3 安装验证启动方式连接互联网
  • UEFI Drivers & UEFI Driver Model

    1 UEFI Drivers UEFI Drivers是UEFI Image的一种 xff0c UEFI Drivers与UEFI Applications的区别 xff1a Objects managed by UEFI based fi
  • 树莓派4B构建debian镜像UEFI启动

    树莓派4B构建debian镜像UEFI启动 前言 今天按照大佬的博客树莓派俱乐部官方 Debian 系统镜像 支持UEFI跑了遍 完整的UEFI镜像构建过程 包括镜像分区 挂载 xff0c 根文件系统的制作 xff0c 内核的移植 xff0
  • UEFI架构

    UEFI架构 UEFI提供系统化的标准方法 xff0c 加载驱动并管理他们之间的交互 前言 xff1a 感谢uefi blog UEFI 提供了一个标准接口 xff0c 以便在硬件发生变更时固件能提供足够信息而保证操作系统不受影响 它包含有
  • 关于UEFI

    最近在Thinkpad上安装Ubuntu12 04的时候 xff0c 经历了几个问题 xff0c 发现BOIS里多了很多选项 xff0c 而且安装双系统也有UEFI有关 xff0c 在网站上找了一篇文章 xff0c 发现这还是一个新概念 x
  • win10+中标麒麟双系统安装步骤

    win7 10 中标麒麟双系统安装步骤 场景要求 联想启天M415台机出厂预装的是win10 现在要改成win7和中标麒麟7 0双系统 开机在选择系统界面要有两个系统选择 并且默认进入win7 注 先安装win7 再安装中标麒麟 一开始是用
  • Win10+Ubuntu16.04双系统重装win10后ubuntu引导失败UEFI启动方式下GRUB消失

    参考博客 http blog csdn net zrf2112 article details 71042782 参考文章 https wiki deepin org index php title E4 BF AE E5 A4 8D E5
  • UEFI源码解析之UEFI_DRIVER

    Dxe Driver可以视作UEFI中的一个服务 在entry中通过protocol安装自己的服务 在Bds等位置通过locate protocol使用该服务 不必依赖与具体的硬件 当需要封装某个设备 控制器或总线的时候 对应于具体的物理实
  • css样式兼容、注释_CSS中的伪注释(或者,浏览器如何解析样式)

    css样式兼容 注释 The CSS spec does not mention it but you can mimic C style and or Unix style line comments in CSS files with
  • UEFI与BIOS(CSM)下安装Windows以及双系统需要知道的一些事

    文章目录 EFI是什么 CSM是什么 UEFI是什么 安装Windows时需要注意什么 安装双系统时需要注意什么 参考 EFI是什么 我之前的一篇博客计算机启动的基本过程提到了BIOS是个程序 存储在BIOS芯片中 而现在的新式电脑用的基本
  • 多系统UEFI启动项清理,windows、ubuntu,win10盘符隐藏

    文章目录 step1 推荐方法 step2 在window系统中启动cmd窗口 win10 隐藏不必要的盘符 如单机多系统情形 step1 推荐方法 参考 https blog csdn net mtllyb article details
  • 从 UEFI 应用程序内部运行 UEFI shell 命令

    我是 UEFI 应用程序开发新手 我的要求是 我需要从 UEFI 应用程序运行 UEFI shell 命令 app efi 源代码 需要指导我如何做到这一点 Example cpUEFI shell 中的命令用于将文件从一个路径复制到 其他
  • 在linux下构建edk2

    我开始用 edk2 编写一个小而简单的应用程序 因此 要编写一个简单的 edk2 UEFI 应用程序 我是这样开始的 git克隆https github com tianocore edk2 git edksetup sh BaseTool
  • 启动时自动运行 EFI 应用程序

    I can 构建并手动执行 http sourceforge net apps mediawiki tianocore index php title Getting Started Writing Simple ApplicationUE
  • 如何在启动操作系统之前进行一些安全验证?

    我有一个可启动闪存盘 其中包含定制的 Ubunto 我想将闪存盘传递给未知的人 但它存在一些安全问题 我想确保未知的人无法更改闪存盘内容 因此 我想计算闪存内容的哈希值并在每次启动时验证它 并在验证失败或哈希不匹配时防止启动操作系统 为此
  • 关闭优化时无法解析的外部符号 __aullshr

    我正在使用 Visual Studio 2015 C C 编译器编译一段 UEFI C 代码 编译器的目标是IA32 不是 X64 当使用 O1 打开优化时 构建正常 When 关闭使用 Od 优化 构建给出以下错误 error LNK20
  • 使用 Visual Studio 构建 UEFI 驱动程序

    我正在寻找有关如何使用 Visual Studio 2012 项目通过 EDK2 SDK 构建 UEFI 驱动程序的建议 我试图静态链接 UefiLib lib 但惨败 我已将该库添加到链接器下的附加依赖项中 include
  • 我的 Docker 无法在 Windows 10 Pro 上启动

    我在 Windows 10 专业版 PC 上设置 Docker 时遇到了一些问题 当我尝试打开它时 我收到此崩溃报告 崩溃报告截图 https i stack imgur com uwkDZ png 这是框内的文字 System Inval
  • UEFI LoadImage 挂起

    我正在考虑使用 Bootservices 函数 LoadImage 从内存加载 UEFI 应用程序映像 函数参数为 typedef EFI STATUS LoadImage IN BOOLEAN BootPolicy IN EFI HAND

随机推荐

  • 0404---通过SSH连接远程服务器运行图形界面程序问题

    远程运行 linux 服务器图形界面程序问题 通常部署在数据中心机房中的服务器是没有图形桌面的 xff0c 对服务器的日常运维也往往通过远程客户端命令窗口来进行 xff0c 但有时候往往需要在服务器上远程安装或运行图形窗口类软件 xff0c
  • Jetson NX emmc版本系统转移到SSD

    因emmc版本的NX自带内存不够大 xff0c 只有16GB xff08 手上的是这个型号 xff09 xff0c 安装系统大概需要除去4G多内存 xff0c 再安装CUDA cuDNN TensorRT等内存直接爆满 无法继续使用 所以需
  • ssh远程登录报错:kex_exchange_identification: Connection closed by remote host

    基本信息 系统 xff1a MacOS Catalina 10 15 7 报错信息 xff1a 终端登录远程 服务器 时报错 xff1a kex exchange identification Connection closed by re
  • 如何在Windows的cmd下让程序在后台执行

    如何在Windows的cmd下让程序在后台执行 xff1f Hu Dennis 2008 12 24 在windows下启动JBoss服务器 xff0c 需要在命令行中输入run bat 但是运行后如果你想停止服务器 xff0c 可能的做法
  • 嵌入式LINUX识别U盘的问题

    我试过mount U盘 当开机后mount 第一个U盘时 xff0c 一般设备名为sda xff0c 然后umount xff0c 并重插另外一个U盘 xff0c 再mount xff0c 发现设备名变为sdb了 此试验进行了几次 xff0
  • yolov4+deepsort(yolo目标检测+自适应卡尔曼滤波追踪+毕业设计代码)

    项目介绍 该项目一个基于深度学习和目标跟踪算法的项目 xff0c 主要用于实现视频中的目标检测和跟踪 该项目使用了 YOLOv4 目标检测算法和 DeepSORT 目标跟踪算法 xff0c 以及一些辅助工具和库 xff0c 可以帮助用户快速
  • 集成学习(含常用案列)

    集成学习原理 xff1a 工作原理是生成多个分类器 模型 xff0c 各自独立地学习和作出预测 这些预测最后结合成组合预测 xff0c 因此优于任何一个单分类的做出预测 集成学习算法分类 xff1a 集成学习算法一般分为 xff1a bag
  • 字节序与比特序详解

    字节序的定义 几种类型的字节序 cpu字节序外部bus字节序设备字节序网络协议字节序 Ethernet协议字节序IP协议字节序 编译字节序 比特序的定义字节序与bit序的转换结构体的位域 字节序的定义 字节序就是说一个对象的多个字节在内存中
  • 【动态规划】01背包问题

    问题描述 有n个物品 xff0c 它们有各自的体积和价值 xff0c 现有给定容量的背包 xff0c 如何让背包里装入的物品具有最大的价值总和 xff1f 为方便讲解和理解 xff0c 下面讲述的例子均先用具体的数字代入 xff0c 即 x
  • 献给初学labview数据采集的初学者

    前言 xff1a 参考来源 xff1a http bbs elecfans com jishu 209658 1 5 html xff0c 感谢原作者 zhihuizhou 这里的内容只针对NI的数据采集卡 xff0c 不保证适用于其它公司
  • 如何从科学论文中实现一个算法

    原文 xff1a http codecapsule com 2012 01 18 how to implement a paper 作者 xff1a Emmanuel Goossaert 本文是从科学论文中实现算法的简短指南 我从书籍和科学
  • 国内C/C++刷题网站汇总

    作者 xff1a Luau Lawrence 链接 xff1a https www zhihu com question 25574458 answer 31175374 来源 xff1a 知乎 Welcome To PKU JudgeOn
  • 华为16道经典面试题

    面试过程中 xff0c 面试官会向应聘者发问 xff0c 而应聘者的 回答将成为面试官考虑是否接受他的重要依据 对应聘者而言 xff0c 了解这些问题背后的 猫腻 至关重要 本文对面试中经常出现的一些典型问题进行了整理 xff0c 并给出相
  • 语音信号的预加重和加窗处理

    原文转载于 xff1a http blog csdn net ziyuzhao123 article details 12004603 非常感谢 一 语音信号的预加重 语音信号的预加重 xff0c 目的是为了对语音的高频部分进行加重 xff
  • 单独编译和使用webrtc音频增益模块(AGC)

    原文转载于 xff1a http www cnblogs com mod109 p 5767867 html top 非常感谢 webrtc的音频处理模块分为降噪ns xff08 nsx xff09 xff0c 回音消除aec xff08
  • 功率谱和频谱的区别

    生活中很多东西之间都依靠信号的传播 xff0c 信号的传播都是看不见的 xff0c 但是它以波的形式存在着 xff0c 这类信号会产生功率 xff0c 单位频带的信号功率就被称之为功率谱 它可以显示在一定的区域中信号功率随着频率变化的分布情
  • 如何解决在rviz中,路径规划导航时,点击2D Pose estimate后机器人位置没有改变,终端也没有反应的问题

    在rviz中 xff0c 点击2D Pose estimate后机器人位置没有改变 xff0c 终端也没有反应 xff0c 通常这种情况就是由于客户端和服务端IP地址不一致导致的 xff0c IP地址有时候系统会自动变更 xff0c 这里我
  • 五款免费开源的语音识别工具

    按 xff1a 本文原作者 Cindi Thompson xff0c 美国德克萨斯大学奥斯汀分校 xff08 University of Texas at Austin xff09 计算机科学博士 xff0c 数据科学咨询公司硅谷数据科学
  • 动态内存分配

    动态内存分配 常见的内存分配的错误 先上一个内存分配的思维导图 便于联想想象 xff0c 理解 xff1a 首先我们介绍一下内存分配的方式 xff1a 1 在静态存储区域中进行分配 内存在程序编译的时候就已经分配好 xff0c 这块内存在程
  • UEFI架构

    UEFI架构 UEFI提供系统化的标准方法 xff0c 加载驱动并管理他们之间的交互 前言 xff1a 感谢uefi blog UEFI 提供了一个标准接口 xff0c 以便在硬件发生变更时固件能提供足够信息而保证操作系统不受影响 它包含有