UEFI学习(三)-创建一个dxe driver-UDK2017

news2025/7/22 8:39:14

创建一个dxe driver
创建UEFI DXE driver
DXE驱动的运行阶段
DXE驱动创建
创建UEFI DXE driver
在edk2中,我们可以了解到它有非常多种类的模块,每种模块运行于不同阶段,上一阶段,我们尝试了一下标准应用程序的工程模块,接下来我们试一下创建一个DXE 驱动模块。借助此过程来了解DXE驱动模块的特点。
在这里插入图片描述
DXE驱动的运行阶段
首先我们要先了解一下,DXE驱动是运行于什么时期,可以通过什么方式展现,对于我们应该怎么去看到自己的模块有没有实现,有没有在运行。由于这方面的内容目前来说有点复制,现在只作简单的描述,UEFI开机过程分为七个阶段,而DXE是其中非常重要的一环,也是我们重点学习的部分,DXE阶段执行大部分系统初始化工作,在此阶段中,DXE会遍历固件中的所有driver并加载满足条件的driver。
通过对DXE简单的了解,我们能做到的便是将我们的driver加入到此中的一环,把我们的驱动模块也加入到生成的固件中,并在开机过程DXE阶段中自动执行我们的模块。
那么,我们又要怎么体现我们的代码是否有实现呢?即使是我们通过非常简单的像打印helloworld,我们又要在哪里看呢?伴随着这些问题,我们可以进入edk2\OvmfPkg\PlatformDxe\目录下,我们可以看到此文件夹名字里直接体现了此模块为DXE driver,通过浏览其中包括的源文件,我们发现其中比较与我们单片机或者c语言开发时比较贴近的几句语法:debug语句。debug在这里debug语句就和我们c语言学习中,经常使用的printf语句的功能一样,用于输出内容,只不过这里存在一些格式问题。所以我们可以通过此方法来输出一些东西了。
但是现在是有输出了,但是输出是输出到哪了呢?从网上了解了UEFI的调试过程后可以知道,UEFI开机的几个阶段中执行过程中会输出debug log来为工程师提供调试。通过查阅后我发现我们的debug的输出的地方就在此日志文件中。

DXE驱动创建
了解了怎么输出,我们就可以开始尝试去实现一个DXE驱动了。

在edk2\OvmfPkg\目录下新建一个自己的文件夹,在里面加入一个和标准应用程序模块一样必须的.c和.inf文件。

在.c文件中输入以下内容,

#include <Uefi.h>
#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/UefiDriverEntryPoint.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiLib.h>
#include <Library/DebugLib.h>
#include <Library/ReportStatusCodeLib.h>

EFI_STATUS
EFIAPI
LfmqTestEntry(
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE* SystemTable
)
{
DEBUG((EFI_D_ERROR, “lfmq:this is lfmq testing!!!\n”));
DEBUG((EFI_D_ERROR, “lfmq:this is lfmq testing!!!\n”));
DEBUG((EFI_D_ERROR, “lfmq:this is lfmq testing!!!\n”));
DEBUG((EFI_D_ERROR, “lfmq:this is lfmq testing!!!\n”));
DEBUG((EFI_D_ERROR, “lfmq:this is lfmq testing!!!\n”));
DEBUG((EFI_D_ERROR, “lfmq:this is lfmq testing!!!\n”));
DEBUG((EFI_D_ERROR, “lfmq:this is lfmq testing!!!\n”));
DEBUG((EFI_D_ERROR, “lfmq:this is lfmq testing!!!\n”));
DEBUG((EFI_D_ERROR, “lfmq:this is lfmq testing!!!\n”));
return EFI_SUCCESS;
}
1
打开.inf文件,并在里面加入以下内容,需要注意的是,根据自己的名称要作对应的修改,例如:BASE_NAME、ENTRY_POINT等。特别要注意的是,DXE driver与标准应用程序模块不同,所以MODULE_TYPE也要修改成UEFI_DRIVER,其含义代表DXE driver。

[Defines]
INF_VERSION = 0x00010005
BASE_NAME = LfmqTest
FILE_GUID = D0B2C191-6255-4AC2-AE8E-73821B3E1F0F
MODULE_TYPE = UEFI_DRIVER
VERSION_STRING = 1.0

ENTRY_POINT = LfmqTestEntry

[Sources]
test.c

[Packages]
MdePkg/MdePkg.dec
MdeModulePkg/MdeModulePkg.dec

[LibraryClasses]
BaseLib
UefiLib
UefiRuntimeServicesTableLib
UefiBootServicesTableLib
UefiDriverEntryPoint
DebugLib

[Guids]

[Protocols]

[Pcd]

同样的,编译之前,我们也需要把我们自己编写的模块加入到.dsc文件中,我们需要把test.inf加进OvmfPkgIa32.dsc,才能保证在编译的时候,我们自己的程序可以被编译。打开OvmfPkgIa32.dsc,同样在[Components]这个块之下加入

OvmfPkg/lfmq/test.inf {

DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
}

此段的解释为LibraryClasses是指定了debug log通过那个库来打印。

而要使我们的模块在bios运行阶段就被执行,我们还需要我们的程序加入到BIOS image中,所以我们同样要把.inf文件加入到对应的OvmfPkgIa32.fdf文件中,我们打开OvmfPkgIa32.fdf文件找到[FV.DXEFV]在此块下面加入
在这里插入图片描述

INF OvmfPkg\lfmq\test.inf
1
接下来我们就可以开始编译了,同样使用cmd进入到edk2根目录下,执行

edksetup.bat
build -a IA32 -p OvmfPkg/OvmfPkgIa32.dsc
1
2
编译通过后,进入edk2\Build\OvmfIa32\DEBUG_VS2019\FV\目录下找到名为OVMF.fd的文件,便是我们此阶段生成的固件文件,这个OVMF.fd文件与之前的不同之处在于,此固件已经加入了我们自己编写的模块,我们的设想是,在它编译时,生成的log中应该存在我们debug的信息。

同样把OVMF.fd复制到qemu安装路径下,并通过cmd命令执行

qemu-system-x86_64 -drive file=OVMF.fd,format=raw,if=pflash -serial file:D:\edkarea\log.txt
1
其中需要注意的是,最后我们通过-serial file:D:\edkarea\log.txt指定了log的输出位置为D:\edkarea\log.txt这个需要自主创建。

qemu执行固件进入到UEFI Shell后,我们打开log.txt。从中查找,我们可以看见:

至此,我们实现了如何去实现一个DXE driver!虽然到此步我们都没有实现什么过于复杂的实现,但是我们应该注重于通过此过程去理解UEFI的每个阶段,这才是我们的根本目的。接下来,我们将参考《UEFI原理与编程》一书和edk2源码,慢慢去理解UEFI的开机的七个阶段!

在这里插入图片描述

qemu-system-x86_64.exe -pflash d:\Mywork\edk2\Build\OvmfX64\DEBUG_VS2017\FV\OVMF.fd -hda fat:rw:d:\Mywork\edk2\QemuDisk  -serial file:D:\log.txt

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

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

相关文章

Centos7超详细安装教程

Centos 7适合初入门的带图形化的界面系统安装 本文是基于VMware虚拟机&#xff0c;centos7 64位安装教学 文章目录Centos 7适合初入门的带图形化的界面系统安装一、软件准备二、VMware新建适配虚拟机三、Centos 安装四、基础检查一、软件准备 VMware 虚拟机安装 官网下载链接&…

Redis 做延迟消息队列

背景 看到消息队列&#xff0c;我们肯定会想到各种MQ&#xff0c;比如&#xff1a;RabbitMQ&#xff0c;acivityMQ、RocketMQ、Kafka等。 但是&#xff0c;当我们需要使用消息中间件的时候&#xff0c;并非每次都需要非常专业的消息中间件&#xff0c;假如我们只有一个消息队…

问一下ChatGPT:DIKW金字塔模型

经常看到这张DIKW金字塔模型图&#xff0c;还看到感觉有点过份解读的图&#xff0c;后面又加上了insight&#xff0c;impact等内容。 Data&#xff1a;是数据&#xff0c;零散的、无规则的呈现到人们眼前&#xff0c;如果你只看到这些数字&#xff0c;如果没有强大的知识背景&a…

STM32之DMA

DMA介绍DMA(Direct MemoryAccess&#xff0c;直接存储器访问)提供在外设与内存、存储器和存储器、外设与外设之间的高速数据传输使用。它允许不同速度的硬件装置来沟通&#xff0c;而不需要依赖于CPU&#xff0c;在这个时间中&#xff0c;CPU对于内存的工作来说就无法使用。DMA…

音乐、音效素材库,好听的BGM都在这~

推荐6个超好用的音频素材网站&#xff0c;免费可商用&#xff0c;热门BGM配乐都能找到&#xff0c;自媒体视频剪辑必备&#xff01;建议收藏&#xff01; 1、菜鸟图库 https://www.sucai999.com/audio.html?vNTYxMjky 菜鸟图库素材非常多&#xff0c;包含了设计、办公、自媒体…

详解FPGA:人工智能时代的驱动引擎观后感

详解FPGA&#xff1a;人工智能时代的驱动引擎观后感 本书大目录 第一章 延续摩尔定律 第二章 拥抱大数据的洪流 第三章 FPGA在人工智能时代的独特优势 第四章 更简单也更复杂——FPGA开发的新方法 第五章 站在巨人肩上——FPGA发展新趋势 文章目录详解FPGA&#xff1a;人工智能…

Redis技术详解

Redis技术详解 Redis是一种支持key-value等多种数据结构的存储系统。可用于缓存&#xff0c;事件发布或订阅&#xff0c;高速队列等场景。支持网络&#xff0c;提供字符串&#xff0c;哈希&#xff0c;列表&#xff0c;队列&#xff0c;集合结构直接存取&#xff0c;基于内存&…

75. CSV文件的写入(保姆级教程)

75. CSV文件的写入&#xff08;保姆级教程&#xff09; 文章目录75. CSV文件的写入&#xff08;保姆级教程&#xff09;1. 目标任务2. 什么是CSV文件2.1 CSV文件知识2.2 准备工作2.3 实操练习12.4 实操练习22.5 实操练习33. os模块文件操作3.1 准备工作3.2 os模块知识回顾3.3 模…

12N60-ASEMI高压MOS管12N60

编辑-Z 12N60在TO-220封装里的静态漏极源导通电阻&#xff08;RDS(ON)&#xff09;为0.7Ω&#xff0c;是一款N沟道高压MOS管。12N60的最大脉冲正向电流ISM为48A&#xff0c;零栅极电压漏极电流(IDSS)为1uA&#xff0c;其工作时耐温度范围为-55~150摄氏度。12N60功耗&#xff…

SpringCloud微服务实战——搭建企业级开发框架(五十):集成移动端推送功能的系统通知公告数据库设计

系统的通知公告功能似乎是很容易被忽略的功能模块&#xff0c;在传统的软件系统中&#xff0c;一般OA类软件系统不可或缺&#xff0c;而在应用软件系统中此功能或有或无&#xff0c;在现在大多数的互联网软件系统中&#xff0c;此功能又必不可缺。所以&#xff0c;在框架设计时…

C++基础了解-04-C++ 变量作用域

变量作用域 一、C 变量作用域 作用域是程序的一个区域&#xff0c;一般来说有三个地方可以定义变量&#xff1a; 1、在函数或一个代码块内部声明的变量&#xff0c;称为局部变量。 2、在函数参数的定义中声明的变量&#xff0c;称为形式参数。 3、在所有函数外部声明的变量…

神经网络结构常见可视化工具汇总及效果演示

文章目录各种训练框架自带的可视化工具pytorch自带pytorchvizkeras自带visualkerasTensorFlow自带TensorBoard其它画图工具NN-SVG&#xff1a;FCNN style、LeNet style、AlexNet stylePlotNeuralNet&#xff1a;使用Latex编写Netron&#xff1a;多种格式的网络模型文件可视化ZE…

计算机网络的166个概念你知道几个 第九部分

计算机网络网络层 路由选择算法&#xff1a;网络层中决定分组发送路径的一种算法。 转发&#xff1a;它指的是将分组从一个输入链路转移到合适的输出链路的动作。 路由选择&#xff1a;指确定分组从一端发送到另一端所选择路径的处理过程。 三种路由交换技术&#xff1a;内…

对word文档中指定的相同内容/文字加颜色或背景颜色

1.请看一段文章。 2.我们要给文中的“code”换成白色字体&#xff0c;黑色背景如何批量呢&#xff1f; 2.1.先摁下“ctrl”"H" 2.2.选择“查找” 2.3.查找内容框填入“code” 2.4.点击以下项中查找&#xff0c;选择主文档。&#xff08;如果你要对某一段文章的相…

Docker操作指南

Docker操作指南 概念解释&#xff1a; 镜像&#xff08;Image&#xff09;&#xff1a;Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起供运行启动&#xff0c;称为镜像。 容器&#xff08;Container&#xff09;&#xff1a;镜像中的应用程序运行后形…

3.7 最大异或对

异或 二进制位同为0&#xff0c;异为1 异或符号 ^ 异或性质&#xff1a; a^a0 a^00 (a^ b ^c) (a^c ^b) 一道异或的题目 最大异或对 题目链接 思路 注重思维方式 首先是暴力想法&#xff0c;使用两重循环&#xff0c;对每两个数字进行取异或运算&#xff0c;得出最大值考虑…

wireshark 着色规则的含义

文章目录前言wireshark 着色规则的含义前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&#xff0c;那欢迎常来啊!!! wires…

【FATE联邦学习debug】 No module named ‘federatedml‘

直接pip install federatedml是无法找得到这个库的。 这个的原因是环境变量的事情&#xff0c;因为在部署文档中&#xff0c;本身提示我们要更新一些环境变量&#xff0c;如果不export那些变量&#xff0c;下面的fate_test其实也是无法测试成功的。 打开bin/init_env.sh&#x…

活动回顾|龙蜥社区标准化SIG首届MeetUp圆满落幕 《龙蜥社区治理规范》征求意见稿正式发布

2 月 25 日周六&#xff0c;龙蜥社区标准化 SIG 召开首次 MeetUp&#xff0c;会上发布了《龙蜥社区治理规范》征求意见稿&#xff0c;致力于通过标准规范开源社区发展&#xff0c;进而推动操作系统行业的规范发展。&#xff08;图/现场合照&#xff09;本次会议共有来自电子标准…

Espressif-IDE v2.8.0 新增功能及开发方向

在乐鑫最近发布的 Espressif-IDE 2.8.0 版本中&#xff0c;我们推出了分区表编辑器和 NVS 分区编辑器功能&#xff0c;优化现有调试器的配置功能并修复多项 Bug &#xff0c;进一步为用户提升了插件质量以及稳定性。 用户可以点此获取最新版本。 • 若您的设备为 Windows 系统…