关于Intel Press出版的《Bedyong BIOS》第2版的观后感

文章目录

    • 此书的背景
    • UEFI运行时
    • DXE基础
    • CPU架构协议
    • PCI协议
    • UEFI驱动的初始化
    • 串口DXE驱动示例

《Beyond BIOS》首先介绍一个简单的UEFI应用程序模块,用于展示UEFI应用程序的行为。作者为Waldo。该模块名为“InitializeHelloApplication”,它接受两个参数:ImageHandle和SystemTable。在程序中,首先向ConsoleOut设备发送一条消息,然后等待用户按下任意键,最后退出应用程序并返回EFI_SUCCESS状态。要执行该UEFI应用程序,可以在UEFI Shell命令行中输入程序名。假设hello.efi在UEFI Shell环境的搜索路径中,可以通过示例Shell> hello来运行该应用程序。该应用程序在用户按下任意键后返回UEFI Shell提示符。本文还提供了一些注释和说明,以帮助读者更好地理解程序的作用和功能。通过这个简单的UEFI应用程序模块,读者可以了解UEFI应用程序的基本结构和行为,以及如何使用UEFI API进行简单的输入输出和操作系统的加载。

在这里插入图片描述

此书的背景

主要介绍了从硬件到软件的飞跃如何带来一段无政府状态和崩溃的时期,特别是在发达国家。这一版还概述了从可扩展固件接口(EFI)到统一可扩展固件接口(UEFI)的演变,以及从英特尔框架规范到UEFI平台初始化(PI)规范的转变。注意,在规范的标题中省略了“Framework”一词。此外,这一章还讨论了UEFI PI规范如何成为行业标准,以及UEFI PI规范如何帮助行业成员更好地实现系统启动和运行。

  1. 该书第二版的出版是经过了时间的考验,因为自从第一版问世以来,技术进步已经取得了巨大的进步。
  2. 对于UEFI和GPT等术语的解释和说明,以便读者更好地理解这些技术在现代计算机系统中的重要性和应用。
  3. 该书的目标仍然是帮助读者理解这些新技术,以及它们在构建现代计算机系统中的角色和作用。
  4. 作者对读者的感谢和认可,以及对支持和鼓励他完成这本书的人的感谢。

UEFI运行时

UEFI Runtime是UEFI(统一可扩展固件接口)规范中的一部分,它定义了在系统引导过程中,固件将控制权交给操作系统后,依然能提供给操作系统运行时使用的服务。这些服务包括系统配置信息、各种UEFI服务和函数等。

在系统引导过程中,当UEFI将控制权交给操作系统后,会继续运行一些服务,这就是UEFI Runtime。这些服务主要运行在固件和操作系统之间,为操作系统提供必要的支持和功能。

具体来说,UEFI Runtime主要提供以下服务:

  1. 系统配置信息:UEFI Runtime提供了一种方式,让操作系统可以获取系统的配置信息,如处理器、内存、硬盘等硬件信息,以及启动参数等。
  2. UEFI服务:UEFI Runtime还提供了一些UEFI服务,如内存管理、文件系统、网络服务等。这些服务可以帮助操作系统更好地运行和管理系统资源。
  3. 运行时函数:UEFI Runtime还提供了一些运行时函数,如重启、关机等操作。这些函数可以在操作系统的运行过程中被调用,以便进行一些系统级别的操作。

需要注意的是,UEFI Runtime并不是一个完整的操作系统,它只是提供了一些必要的服务和函数,以便操作系统可以更好地运行和管理系统资源。

DXE基础

DXE指的是平台初始化驱动执行环境,它在UEFI(统一可扩展固件接口)的预引导阶段和PEI(Pre-EFI Initialization)阶段之间起着关键的作用。DXE的主要功能是将平台硬件映射到各种硬件平台上,以便在UEFI服务可用之前执行。

在DXE阶段,一些重要的组件包括DXE核心、DXE调度程序和DXE驱动程序。DXE核心提供了一个执行环境,它负责将PEI的核心服务映射到各种硬件平台上。DXE调度程序负责在DXE服务中调度和执行各种服务。DXE驱动程序则负责与硬件交互,以便在UEFI服务可用之前执行。

此外,DXE还包括一些重要的协议,例如ACPI(高级配置和电源接口)编辑协议和SIO(系统输入输出)协议。ACPI编辑协议用于编辑和读取ACPI表,这些表描述了系统的硬件配置和电源管理设置。SIO协议则提供了与系统输入/输出设备的通信功能。

在DXE阶段还有一些重要的概念,例如BDS(Boot Device Selection)阶段。BDS阶段是在UEFI服务可用之前执行的,它负责选择启动设备并加载启动设备上的引导加载程序。

总之,DXE是UEFI固件的一个重要组成部分,它提供了一个执行环境,将平台硬件映射到各种硬件平台上,以便在UEFI服务可用之前执行。它还包括一些重要的组件和协议,以提供必要的服务和与硬件交互的功能。

CPU架构协议

主要介绍了UEFI的定义、重要概念和协议、系统管理模式的更新、设备驱动模型的交互作用以及安全功能等内容。

  1. 介绍了Unified Extensible Firmware Interface (UEFI)的定义和作用。UEFI是一种描述平台硬件接口的规范,它允许在预操作系统阶段进行一些操作,如加载驱动、运行诊断等。
  2. 描述了UEFI中的一些重要概念和协议,如Multiprocessor Protocol、Itanium E-SAL and MCA support、Report-status code listener、SMBIOS protocol、ACPI editing protocol、SIO protocol等。
  3. 介绍了UEFI在系统管理模式的更新,包括对SMM协议和基础设施的抽象化处理,以及将各种CPU和芯片组的实现从更通用的组件中分离出来。
  4. 描述了UEFI在设备驱动模型中的交互作用,包括如何配置基础设施和使用配置基础设施等。
    介绍了UEFI的安全功能,如Trusted Platform Module (TPM)和Measured Boot等。

PCI协议

  1. PCI I/O Protocol:这是一种由PCI总线驱动程序为每个PCI设备安装的协议实例。每个PCI I/O协议实例都配备了针对该PCI设备独特的数据值,包括UEFI选项ROM(OpROM)图像的位置和大小。
  2. Driver Model Interactions:介绍了如何使用配置基础设施来管理驱动程序模型之间的交互。
  3. Provisioning the Platform:介绍了如何使用配置基础设施来配置和启动平台组件,以及如何使用UEFI Secure Boot和UEFI Executable Verification等机制来确保平台的安全性和可信性。

UEFI驱动的初始化

UEFI驱动的初始化在UEFI固件加载后开始,主要在UEFI的SEC(安全验证)阶段进行。在这个阶段,计算机系统加电后进入SEC阶段,执行以下四种任务:

  1. 对计算机系统的基本硬件进行安全验证。
  2. 对计算机系统的固件进行加载。
  3. 初始化固件所需要的硬件设备。
  4. 执行其他必要的初始化操作。

在SEC阶段结束后,PEI(EFI前期初始化)阶段开始,这个阶段主要进行硬件的初始化工作。然后是DXE(驱动执行环境)阶段,在这个阶段,UEFI驱动程序被加载并准备运行。BDS(启动设备选择)阶段和TSL(操作系统加载前期)阶段是操作系统加载器作为UEFI应用程序运行的阶段。最后是RT(Run Time)阶段和AL(系统灾难恢复期)阶段。RT阶段包括操作系统加载器后期和操作系统运行期,当系统硬件或操作系统出现严重错误不能继续正常运行时,固件会尝试修复错误,这时系统进入AL期。但PI规范和UEFI规范都没有规定AL期的行为。

串口DXE驱动示例

DXE驱动的一般开发过程如下:

  1. 确定需要开发的DXE驱动的用途和功能,例如用于初始化某个硬件设备或提供某个特定的服务。
  2. 了解DXE驱动的架构和规范,包括UEFI规范和相关的协议,例如ACPI编辑协议和SIO协议等。
  3. 编写DXE驱动的代码,包括驱动程序的入口点、服务处理函数、回调函数等。
  4. 编译DXE驱动的代码,生成可执行文件。
  5. 将可执行文件加载到UEFI固件中,并测试DXE驱动的功能和稳定性。

下面是一个示例:

#include <Protocol/SimpleFilesystem.h>  
#include <Protocol/SerialPort.h>  
#include <Protocol/DevicePath.h>  
#include <Library/BaseLib.h>  
#include <Library/DebugLib.h>  
  
// 串口DXE驱动程序入口点  
EFI_STATUS  
EFIAPI  
SerialDxeInitialize(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)  
{  
    // 获取串口设备路径  
    EFI_DEVICE_PATH_PROTOCOL *DevicePath;  
    DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) ImageHandle;  
      
    // 获取串口参数  
    UINTN BaudRate = 9600;  
    UINTN DataBits = 8;  
    UINTN Parity = 0;  
    UINTN StopBits = 1;  
      
    // 初始化串口  
    EFI_STATUS Status;  
    Status = gBS->LocateProtocol(&gEfiSerialPortProtocolGuid, NULL, (VOID **)&SerialPort);  
    if (EFI_ERROR(Status)) {  
        return Status;  
    }  
    Status = SerialPort->Initialize(SerialPort, BaudRate, DataBits, Parity, StopBits);  
    if (EFI_ERROR(Status)) {  
        return Status;  
    }  
      
    // 打开串口并测试连接是否正常  
    Status = SerialPort->Open(SerialPort, DevicePath);  
    if (EFI_ERROR(Status)) {  
        return Status;  
    }  
    CHAR16 Buffer[10];  
    Status = SerialPort->Read(SerialPort, Buffer, sizeof(Buffer));  
    if (EFI_ERROR(Status)) {  
        return Status;  
    }  
      
    // 返回成功状态码  
    return EFI_SUCCESS;  
}

INF文件配置:

[Defines]
INF_VERSION =0x00010005
BASE_NAME = SerialDxe
FILE_GUID = 0x12345678-0x1234-0x1234-0x1234-0x123456789abc
MODULE_TYPE = DXE_DRIVER
VERSION_STRING = 1.0
ENTRY_POINT = SerialDxeInitialize
  1. INF_VERSION:INF文件的版本号,这里设置为0x00010005。
  2. BASE_NAME:驱动程序的名称,这里设置为SerialDxe。
  3. FILE_GUID:驱动程序的GUID,这里随意设置了一个值。
  4. MODULE_TYPE:驱动程序的类型,这里设置为DXE_DRIVER。
  5. VERSION_STRING:驱动程序的版本号,这里设置为1.0。
  6. ENTRY_POINT:驱动程序的入口点函数,这里设置为SerialDxeInitialize。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/115542.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Mysql】Mysql中表连接的原理

连接简介 在实际工作中&#xff0c;我们需要查询的数据很可能不是放在一张表中&#xff0c;而是需要同时从多张表中获取。下面我们以简单的两张表为例来进行说明。 连接的本质 为方便测试说明&#xff0c;&#xff0c;先创建两个简单的表并给它们填充一点数据&#xff1a; …

保障效率与可用,分析Kafka的消费者组与Rebalance机制

系列文章目录 上手第一关&#xff0c;手把手教你安装kafka与可视化工具kafka-eagle Kafka是什么&#xff0c;以及如何使用SpringBoot对接Kafka 架构必备能力——kafka的选型对比及应用场景 Kafka存取原理与实现分析&#xff0c;打破面试难关 防止消息丢失与消息重复——Kafka可…

react+canvas实现横跨整个页面的动态的波浪线(贝塞尔曲线)

本来写这个特效 我打算用css实现的&#xff0c;结果是一波三折&#xff0c;我太难了&#xff0c;最终没能用css实现&#xff0c;转战了canvas来实现。来吧先看效果图 当然这个图的波浪高度、频率、位置、速度都是可调的&#xff0c;请根据自己的需求调整&#xff0c;如果你讲波…

windows10系统-17-文献管理软件

参考诸多文献管理软件的优劣比较如何&#xff1f;你有哪些使用心得&#xff1f; 参考我愿称之为目前最好用的文献管理和阅读软件&#xff01;readpaper 1 文献总结 文献总结是非常重要的一项技能&#xff0c;不知道大家看完文献后有没有总结文献的习惯&#xff0c;有的话那挺…

数据仓库-拉链表

在数据仓库中制作拉链表&#xff0c;可以按照以下步骤进行&#xff1a; 确定需求&#xff1a;首先明确需要使用拉链表的场景和需求。例如&#xff0c;可能需要记录历史数据的变化&#xff0c;以便进行时间序列分析等。设计表结构&#xff1a;在数据仓库中&#xff0c;拉链表通…

Web自动化测试 —— PageObject设计模式!

一、page object 模式简介 1.1、传统 UI 自动化的问题 无法适应 UI 频繁变化无法清晰表达业务用例场景大量的样板代码 driver/find/click 二、page object 设计原则 2.1、POM 模式的优势 降低 UI 变化导致的测试用例脆弱性问题让用例清晰明朗&#xff0c;与具体实现无关 2.…

JVM常用命令

jps —查看pid jstat -gcutil 4364 1000 2000 —查看堆内存占用百分比&#xff0c;每秒打印1次&#xff0c;总共打印2000次 S0&#xff1a;幸存1区当前使用比例 S1&#xff1a;幸存2区当前使用比例 E&#xff1a;伊甸园区使用比例 O&#xff1a;老年代使用比例 M&#xff1a;元…

服务Service

一、服务概述 Service(服务)是Android四大组件之一&#xff0c;是能够在后台长时间执行操作并且不是供用户界面的应用程序组件。Senice可以与其他组件进行交互&#xff0c;一般由Activity启动&#xff0c;但是并不依赖于Activity。当Activity的生命周期结束时&#xff0c;Serv…

野火霸天虎 STM32F407 学习笔记_1 stm32介绍;调试方法介绍

STM32入门——基于野火 F407 霸天虎课程学习 前言 博主开始探索嵌入式以来&#xff0c;其实很早就开始玩 stm32 了。但是学了一段时间之后总是感觉还是很没有头绪&#xff0c;不知道在学什么。前前后后分别尝试了江协科技、正点原子、野火霸天虎三次 stm32 的课程学习。江协科…

学Python,一个月从小白到大神?看你怎么学!

Python是一门超强大而且超受欢迎的编程语言。它被用在各种领域&#xff0c;比如网站开发、数据分析、人工智能和机器学习。学会Python会给你创造很多职业机会&#xff0c;所以绝对是值得一试的。 但你有没有过这样的梦想&#xff1a;一个月时间&#xff0c;从Python小白变成Py…

Docker DeskTop安装与启动(Windows版本)

一、官网下载Docker安装包 Docker官网如下&#xff1a; Docker官网不同操作系统下载页面https://docs.docker.com/desktop/install/windows-install/ 二、安装Docker DeskTop 2.1 双击 Docker Installer.exe 以运行安装程序 2.2 安装操作 默认勾选&#xff0c;具体操作如下…

页面淘汰算法模拟实现与比较

1.实验目标 利用标准C 语言&#xff0c;编程设计与实现最佳淘汰算法、先进先出淘汰算法、最近最久未使用淘汰算法、简单 Clock 淘汰算法及改进型 Clock 淘汰算法&#xff0c;并随机发生页面访问序列开展有关算法的测试及性能比较。 2.算法描述 1. 最佳淘汰算法&#xff08;Op…

编写shell脚本,利用mysqldump实现mysql数据库分库分表备份

摘要&#xff1a;本文介绍了如何使用 Shell 脚本和 mysqldump 工具实现 MySQL 数据库的分库分表备份。通过编写脚本&#xff0c;我们可以自动化备份多个数据库以及每个数据库中的所有表&#xff0c;并将备份文件按照数据库和表的层次结构进行存储。 一、准备工作 在开始编写 Sh…

HMDD 4.0:miRNA-疾病关系数据库

拥有多项自主专利技 术和软件著作权&#xff0c;具 有丰富的数据库平台 搭建经验。 凌恩-盈飞团队 MicroRNA&#xff08;miRNA&#xff09;是一类重要的小非编码RNA&#xff0c;在疾病诊断和治疗中发挥着重要作用。人类 MicroRNA 疾病数据库 (HMDD) 为 miRNA 相关医学提供了…

【云原生基础】了解云原生,什么是云原生?

&#x1f4d1;前言 本文主要讲了云原生的基本概念和原则的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日一句&#x…

人工智能师求职面试笔试题及答案汇总

人工智能师求职面试笔试题及答案汇总 1.如何在Python中实现一个生成器&#xff1f; 答&#xff1a;在Python中&#xff0c;生成器是一种特殊类型的迭代器。生成器允许你在需要时才生成值&#xff0c;从而节省内存。生成器函数在Python中是通过关键字yield来实现的。例如&…

leetCode 137. 只出现一次的数字 II(拓展篇) + 模5加法器 + 真值表(数字电路)

leetCode 137. 只出现一次的数字 II 有其他的题解可看我的往期文章&#xff1a; leetCode 137. 只出现一次的数字 II 位运算 模3加法器 真值表&#xff08;数字电路&#xff09; 有限状态机-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/134138112?sp…

生成带分表和水印的excel压缩文件

功能描述 将查询结果生成带分表和水印的excel压缩文件 功能点 1、将查询结果导出为excel文件 2、每个表格存放50万条数据&#xff0c;超过50万条数据&#xff0c;生成新的分表 3、生成的表格需要添加水印 4、将生成的全部分表&#xff0c;打包成zip压缩文件 引入依赖 <…

【LeetCode】每日一题 2023_11_2 环和杆(题目质量不错)

文章目录 刷题前唠嗑题目&#xff1a;环和杆题目描述代码与解题思路看看别人的题解 结语 刷题前唠嗑 今天是简单&#xff0c;我快乐了 题目&#xff1a;环和杆 题目链接&#xff1a;2103. 环和杆 题目描述 代码与解题思路 func countPoints(rings string) (ans int) {num…

强化学习的动态规划二

一、典型示例 考虑如下所示的44网格。 图1 非终端状态为S {1, 2, . . . , 14}。在每个状态下有四种可能的行为&#xff0c;A {up, down, right, left}&#xff0c;这些行为除了会将代理从网格上移走外&#xff0c;其他都会确定性地引起相应的状态转换。因此&#xff0c;例如&…