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

news2024/11/25 2:58:38

文章目录

    • 此书的背景
    • 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.coloradmin.cn/o/1170108.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云栖大会,到底有些啥?

引言&#xff1a;10月31日至11月2日&#xff0c;2023云栖大会在杭州云栖小镇召开。小枣君去了现场&#xff0c;拍了一些照片&#xff0c;特来给大家做一个图文汇报。 云栖大会的前身&#xff0c;是2009年开始举办的地方网站峰会。2011年&#xff0c;这个峰会演变成阿里云开发者…

Linux的历史与环境

目录 Linux的背景介绍 Linux的时代背景-硅谷模式 计算机发展 UNIX发展历史 Linux诞生的偶然与必然 Linux开源 Linux发行版本 搭建Linux的环境 1.直接安装在物理机上 2.使用虚拟机软件 3.使用云服务器 &#xff08;1&#xff09;购买云服务器 &#xff08;2&#x…

docker是干什么的

很多朋友刚接触docker&#xff0c;不知道docker做什么&#xff0c; 这里白眉大叔给大家普及一下 docker的知识以及docker和虚拟机的区别。 你可以这样认为&#xff0c;docker 就是 打包应用程序的工具。 怎么理解这个工具呢&#xff1f; 1-如何理解docker 这个打包工具&#x…

作为一个初学者,该如何入门大模型?

在生成式 AI 盛行的当下&#xff0c;你是否被这种技术所折服&#xff0c;例如输入一段简简单单的文字&#xff0c;转眼之间&#xff0c;一幅精美的图片&#xff0c;又或者是文笔流畅的文字就展现在你的面前。 相信很多人有这种想法&#xff0c;认为生成式 AI 深不可测&#xf…

选择适合你的办公桌:提高工作效率的关键

​在如今的数字时代&#xff0c;越来越多的人将办公桌移到家里或办公室。但是&#xff0c;如何选择适合你的办公桌可能是个挑战。不同的工作需要和工作空间大小会影响你的选择。下面是一些简单的建议&#xff0c;帮助你找到适合你的办公桌&#xff0c;提高工作效率。 首先&…

世微 平均电流型降压恒流驱动器 电动摩托车LED灯小钢炮驱动IC AP5218

1&#xff0c;来源&#xff1a;深圳市世微半导体有限公司 2&#xff0c;产品描述 AP5218 是一款 PWM工作模式, 高效率、外 围简单、内置功率管&#xff0c;适用于5V&#xff5e;100V输入的高 精度降压 LED 恒流驱动芯片。输出最大功率可达 15W&#xff0c;最大电流 1.5A。AP5…

Leetcode—2512.奖励最顶尖的K名学生【中等】

2023每日刷题&#xff08;十九&#xff09; Leetcode—2512.奖励最顶尖的K名学生 哈希表stringstream排序算法思想 实现代码 class Solution { public:vector<int> topStudents(vector<string>& positive_feedback, vector<string>& negative_feed…

MySQL中如何书写update避免锁表

1. 什么是MySQL锁表&#xff1f; MySQL锁表是指在对某个数据表进行读写操作时&#xff0c;为了保证数据的一致性和完整性&#xff0c;系统会对该数据表进行锁定&#xff0c;防止其他用户对该表进行操作。 2. 为什么会出现锁表&#xff1f; 当多个用户同时对同一个数据表进行…

(附源码)基于springboot校园自媒体信息服务平台-计算机毕设 84565

springboot校园自媒体信息服务平台 目 录 摘要 1 绪论 1.1课题意义 1.2开发现状 1.3系统开发技术的特色 1.4springboot框架介绍 1.5论文结构与章节安排 2 2校园自媒体信息服务平台系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1数据增加流程 2.3.2数据修改流程 2…

一文搞定 Linux 中 Python 环境/版本管理

Python 的环境/版本管理实在是依托答辩&#xff0c;感觉不如 Node.js。 尤其是在 Linux 环境下&#xff0c;多数发行版的系统组件、工具依赖自带的 Python&#xff0c;折腾系统自带的 Python 环境时&#xff0c;一个搞不好就会把整个系统干掉。 同时&#xff0c;研究安全的小伙…

前端使用firebase配置第三方登录介绍(谷歌登录,facebook登录等)

参考文档 点此处去 firebase 官网点此处去 web端的谷歌登录文档 实现 首先注册一个账号登录firebase&#xff08;可以使用谷歌账号登录&#xff09; 然后创建项目&#xff08;走默认配置就行了&#xff09; 添加应用&#xff08;走默认配置&#xff09;&#xff0c;如图所…

SpringBoot-SpringTask定时任务

文章目录 Spring Task 介绍cron 表达式Spring Task 入门案例 Spring Task 介绍 Spring Task 是 Spring 框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代码逻辑。 作用&#xff1a;定时自动执行某段 Java 代码 应用场景&#xff1a; 信用卡每月还款提醒…

【java学习—十二】文件字节流(2)

文章目录 1. 文件字节输入流2. 文件字节输出流3. 练习 1. 文件字节输入流 举例&#xff1a; tt1.txt文件内容为&#xff1a;aaaa package day12;import java.io.FileInputStream;public class Test1 {public static void main(String[] args) {Test1.testFileInputStream();}…

【Vue3+Vite+bwip-js库】 生成DataMatrix码

前提条件 已存在的vue3vite架构前端项目对二维码分类有一定的了解 生成的码的样式如下&#xff08;DataMatrix&#xff09; 该二维码容量如下 详情见&#xff1a;DataMatrix介绍 Vue3Vite 导入 bwip-js生成DataMatrix 1. 安装 npm install bwip-js --save2. 引入使用 <…

「视频编码软件」Media Encoder(Me) 2024 Mac/win中文版下载安装

Adobe Media Encoder(Me) 2024是一款专业的视频编码工具&#xff0c;它可以将各种视频格式进行转换、压缩和编码&#xff0c;以满足不同媒体平台和设备的需求。 以下是 Media Encoder 2023 的主要功能和新增功能&#xff1a; 视频编码和转换&#xff1a;支持将各种视频格式进…

代码随想录算法训练营第四十三天丨 动态规划part06

518.零钱兑换II 思路 这是一道典型的背包问题&#xff0c;一看到钱币数量不限&#xff0c;就知道这是一个完全背包。 对完全背包还不了解的同学&#xff0c;可以看这篇&#xff1a;动态规划&#xff1a;关于完全背包&#xff0c;你该了解这些&#xff01;(opens new window)…

苹果IOS系统webglcontextlost问题-解决方案

问题描述 在IOS手机 解码视频流的时候&#xff0c;第一次可以正常播放&#xff0c;但只要IOS手机熄屏&#xff0c;再重新唤醒&#xff0c;就会一直播放失败&#xff0c;无论换哪个浏览器都不行。安卓手机则一切正常。 经过排查&#xff0c;发现 IOS手机 的浏览器会无故 webGL…

大聪明教你学Java | Win10 环境下安装部署 RocketMQ

前言 &#x1f34a;作者简介&#xff1a; 不肯过江东丶&#xff0c;一个来自二线城市的程序员&#xff0c;致力于用“猥琐”办法解决繁琐问题&#xff0c;让复杂的问题变得通俗易懂。 &#x1f34a;支持作者&#xff1a; 点赞&#x1f44d;、关注&#x1f496;、留言&#x1f4…

Word里MathType插件符号表消失了

场景再现 在word里面编辑数学公式&#xff0c;结果符号表跑到屏幕外面了&#xff0c;找不到&#xff1b; 解决办法 在其中找到视图->工具栏&#xff0c;点击即可&#xff1a; 还嫌弃它跑到外边了&#xff0c;那就可以点击符号表的边框&#xff1a; 双击左边边框&#x…

YOLO目标检测——夜间车辆检测数据集【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;智能交通监控系统、自动驾驶系统、夜间行车安全辅助系统等数据集说明&#xff1a;夜间车辆检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富标签说明&#xff1a;使用lableimg标注软件标注&#xff0c;标注框质量高&#xff0…