.net如何建设网站,老版建设银行网站,滨州网站建设有实力,阳江网雨大精神病专科医院文章目录 此书的背景UEFI运行时DXE基础CPU架构协议PCI协议UEFI驱动的初始化串口DXE驱动示例 《Beyond BIOS》首先介绍一个简单的UEFI应用程序模块#xff0c;用于展示UEFI应用程序的行为。作者为Waldo。该模块名为“InitializeHelloApplication”#xff0c;它接受两个参数用于展示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规范如何帮助行业成员更好地实现系统启动和运行。
该书第二版的出版是经过了时间的考验因为自从第一版问世以来技术进步已经取得了巨大的进步。对于UEFI和GPT等术语的解释和说明以便读者更好地理解这些技术在现代计算机系统中的重要性和应用。该书的目标仍然是帮助读者理解这些新技术以及它们在构建现代计算机系统中的角色和作用。作者对读者的感谢和认可以及对支持和鼓励他完成这本书的人的感谢。
UEFI运行时
UEFI Runtime是UEFI统一可扩展固件接口规范中的一部分它定义了在系统引导过程中固件将控制权交给操作系统后依然能提供给操作系统运行时使用的服务。这些服务包括系统配置信息、各种UEFI服务和函数等。
在系统引导过程中当UEFI将控制权交给操作系统后会继续运行一些服务这就是UEFI Runtime。这些服务主要运行在固件和操作系统之间为操作系统提供必要的支持和功能。
具体来说UEFI Runtime主要提供以下服务
系统配置信息UEFI Runtime提供了一种方式让操作系统可以获取系统的配置信息如处理器、内存、硬盘等硬件信息以及启动参数等。UEFI服务UEFI Runtime还提供了一些UEFI服务如内存管理、文件系统、网络服务等。这些服务可以帮助操作系统更好地运行和管理系统资源。运行时函数UEFI Runtime还提供了一些运行时函数如重启、关机等操作。这些函数可以在操作系统的运行过程中被调用以便进行一些系统级别的操作。
需要注意的是UEFI Runtime并不是一个完整的操作系统它只是提供了一些必要的服务和函数以便操作系统可以更好地运行和管理系统资源。
DXE基础
DXE指的是平台初始化驱动执行环境它在UEFI统一可扩展固件接口的预引导阶段和PEIPre-EFI Initialization阶段之间起着关键的作用。DXE的主要功能是将平台硬件映射到各种硬件平台上以便在UEFI服务可用之前执行。
在DXE阶段一些重要的组件包括DXE核心、DXE调度程序和DXE驱动程序。DXE核心提供了一个执行环境它负责将PEI的核心服务映射到各种硬件平台上。DXE调度程序负责在DXE服务中调度和执行各种服务。DXE驱动程序则负责与硬件交互以便在UEFI服务可用之前执行。
此外DXE还包括一些重要的协议例如ACPI高级配置和电源接口编辑协议和SIO系统输入输出协议。ACPI编辑协议用于编辑和读取ACPI表这些表描述了系统的硬件配置和电源管理设置。SIO协议则提供了与系统输入/输出设备的通信功能。
在DXE阶段还有一些重要的概念例如BDSBoot Device Selection阶段。BDS阶段是在UEFI服务可用之前执行的它负责选择启动设备并加载启动设备上的引导加载程序。
总之DXE是UEFI固件的一个重要组成部分它提供了一个执行环境将平台硬件映射到各种硬件平台上以便在UEFI服务可用之前执行。它还包括一些重要的组件和协议以提供必要的服务和与硬件交互的功能。
CPU架构协议
主要介绍了UEFI的定义、重要概念和协议、系统管理模式的更新、设备驱动模型的交互作用以及安全功能等内容。
介绍了Unified Extensible Firmware Interface (UEFI)的定义和作用。UEFI是一种描述平台硬件接口的规范它允许在预操作系统阶段进行一些操作如加载驱动、运行诊断等。描述了UEFI中的一些重要概念和协议如Multiprocessor Protocol、Itanium E-SAL and MCA support、Report-status code listener、SMBIOS protocol、ACPI editing protocol、SIO protocol等。介绍了UEFI在系统管理模式的更新包括对SMM协议和基础设施的抽象化处理以及将各种CPU和芯片组的实现从更通用的组件中分离出来。描述了UEFI在设备驱动模型中的交互作用包括如何配置基础设施和使用配置基础设施等。 介绍了UEFI的安全功能如Trusted Platform Module (TPM)和Measured Boot等。
PCI协议
PCI I/O Protocol这是一种由PCI总线驱动程序为每个PCI设备安装的协议实例。每个PCI I/O协议实例都配备了针对该PCI设备独特的数据值包括UEFI选项ROMOpROM图像的位置和大小。Driver Model Interactions介绍了如何使用配置基础设施来管理驱动程序模型之间的交互。Provisioning the Platform介绍了如何使用配置基础设施来配置和启动平台组件以及如何使用UEFI Secure Boot和UEFI Executable Verification等机制来确保平台的安全性和可信性。
UEFI驱动的初始化
UEFI驱动的初始化在UEFI固件加载后开始主要在UEFI的SEC安全验证阶段进行。在这个阶段计算机系统加电后进入SEC阶段执行以下四种任务
对计算机系统的基本硬件进行安全验证。对计算机系统的固件进行加载。初始化固件所需要的硬件设备。执行其他必要的初始化操作。
在SEC阶段结束后PEIEFI前期初始化阶段开始这个阶段主要进行硬件的初始化工作。然后是DXE驱动执行环境阶段在这个阶段UEFI驱动程序被加载并准备运行。BDS启动设备选择阶段和TSL操作系统加载前期阶段是操作系统加载器作为UEFI应用程序运行的阶段。最后是RTRun Time阶段和AL系统灾难恢复期阶段。RT阶段包括操作系统加载器后期和操作系统运行期当系统硬件或操作系统出现严重错误不能继续正常运行时固件会尝试修复错误这时系统进入AL期。但PI规范和UEFI规范都没有规定AL期的行为。
串口DXE驱动示例
DXE驱动的一般开发过程如下
确定需要开发的DXE驱动的用途和功能例如用于初始化某个硬件设备或提供某个特定的服务。了解DXE驱动的架构和规范包括UEFI规范和相关的协议例如ACPI编辑协议和SIO协议等。编写DXE驱动的代码包括驱动程序的入口点、服务处理函数、回调函数等。编译DXE驱动的代码生成可执行文件。将可执行文件加载到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 SerialDxeInitializeINF_VERSIONINF文件的版本号这里设置为0x00010005。BASE_NAME驱动程序的名称这里设置为SerialDxe。FILE_GUID驱动程序的GUID这里随意设置了一个值。MODULE_TYPE驱动程序的类型这里设置为DXE_DRIVER。VERSION_STRING驱动程序的版本号这里设置为1.0。ENTRY_POINT驱动程序的入口点函数这里设置为SerialDxeInitialize。