首页 > 其他分享 >UEFI 基础教程 (三) - 运行第一个PEI Driver

UEFI 基础教程 (三) - 运行第一个PEI Driver

时间:2023-05-06 13:32:57浏览次数:33  
标签:edkii OvmfPkg Driver EFI PEI 基础教程 include MyHelloWorldPEIMDriver


一、 编写源代码
编写C:\edkii\OvmfPkg\MyHelloWorldPEIMDriver\MyHelloWorldPEIMDriver.c

#include <uefi.h>
 #include <Library/UefiLib.h>
 #include <Library/BaseLib.h>
 #include <Library/DebugLib.h>
 #include <Library/BaseMemoryLib.h>
 #include <Library/UefiDriverEntryPoint.h>
 #include <Library/PeimEntryPoint.h>
 #include <Library/PeiServicesLib.h>
 #include <Library/PeiServicesTablePointerLib.h>
 #include <Pi/PiHob.h>EFI_GUID gMyHelloWorldPEIGUID = { 0xbdb38129, 0x4d65, 0x39f4, { 0x72, 0x12, 0x68, 0xcf, 0x5a, 0x19, 0xa, 0xf8 }};
//ShellCEntryLib call user interface ShellAppMain
 EFI_STATUS
 EFIAPI
 MyHelloWorldPEIMDriverEntry(
 IN EFI_PEI_FILE_HANDLE FileHandle,
 IN CONST EFI_PEI_SERVICES **PeiServices
 )
 {
 EFI_STATUS Status = EFI_SUCCESS;
 DEBUG ((EFI_D_ERROR, “MyHelloWorldPEIMDriver Start…\n”));
 DEBUG ((EFI_D_ERROR, “MyHelloWorldPEIMDriver End…\n”));
 return Status;
 }

编写C:\edkii\OvmfPkg\MyHelloWorldPEIMDriver\MyHelloWorldPEIMDriver.inf

[Defines]
 INF_VERSION = 0x00010006
 BASE_NAME = MyHelloWorldPEIMDriver
 FILE_GUID = 69E6DE6D-F09E-485f-9937-EB70FDCFC82B
 MODULE_TYPE = PEIM
 VERSION_STRING = 1.0
 ENTRY_POINT = MyHelloWorldPEIMDriverEntry[Sources]
 MyHelloWorldPEIMDriver.c[Packages]
 MdePkg/MdePkg.dec
 ShellPkg/ShellPkg.dec
 MdeModulePkg/MdeModulePkg.dec[LibraryClasses]
 BaseLib
 PeimEntryPoint
 BaseMemoryLib
 DebugLib
 PeiServicesLib[depex]
 TRUE

修改C:\edkii\OvmfPkg\OvmfPkgX64.dsc
[Components]

PEI Phase modules

OvmfPkg/MyHelloWorldPEIMDriver/MyHelloWorldPEIMDriver.inf

修改C:\edkii\OvmfPkg\OvmfPkgX64.fdf

[FV.PEIFV]

PEI Phase modules


INF OvmfPkg/MyHelloWorldPEIMDriver/MyHelloWorldPEIMDriver.inf

二、 编译生成EFI文件
运行edksetup.bat编译整个OvmfPkg Package,之后查看生成的efi如下,

三、 运行HelloWorld Pei Driver
拷贝 C:\edkii\Build\OvmfX64\DEBUG_VS2013x86\FV\OVMF.fd 到C:\qemu
执行setup-qemu-x64.bat 将输出定向到日志文件MyHelloWorldPEIMDriver.log
然后, 从日志文件查看MyHelloWorldPEIMDriver PEI driver的输出如下,

四、 小结
UEFI PEIM和UEFI APP的写法区别:

就是INF文件中的MODULE_TYPE不同(PEIM、UEFI_APPLICATION)

FDF 文件中放置位置不同

PEIM需要放在[FV.PEIFV]下,编译完成后会打包到OVMF.fd中;而 APP 不用强制放在FDF中,一般放在存储设备(HDD)中执行。

UEFI 基础教程 (三) - 运行第一个PEI Driver_学习

UEFI 基础教程 (三) - 运行第一个PEI Driver_日志文件_02

UEFI 基础教程 (三) - 运行第一个PEI Driver_#include_03


标签:edkii,OvmfPkg,Driver,EFI,PEI,基础教程,include,MyHelloWorldPEIMDriver
From: https://blog.51cto.com/u_3619476/6249556

相关文章

  • OrchardCore 中的 插件开发/ Shape / DisplayDriver / 视图扩展 / Razor代码注入
    请注意该文章仅限于OrchardCore项目中的DisplayDriver扩展机制,ASP.NETCOREMVC自身并没有对应功能,如果需要可以将相关的OrchardCore模块添加到项目中也可以实现响应功能背景最近一个功能需求,需要使用其它用户模拟身份,所以计划在用户列表页面扩展按钮组功能那么开始看代......
  • 在 linux-4.9/drivers/usb/serial/ch341.c 上串口收发数据异常
    有天做USBhost串口驱动的时候发下FT\CP都没有问题,就CH341有问题,读写正常,但数据不正常。有一点稀奇,可能是ch中间有版本变更了吧。解法就更新到https://github.com/torvalds/linux/blob/master/drivers/usb/serial/ch341.c最新的代码就行,有一些函数有出入,但大体影响......
  • 修改docker的cgroup driver为systemd
    简单来说修改docker的cgroupdriver为systemd的原因是因为在文档CRIinstallation中的相关说明:“使用systemd作为initsystem的Linux的发行版,使用systemd作为docker的cgroupdriver可以确保服务器节点在资源紧张的情况更加稳定”。但是在修改后发现自己的docker服务无法正常启动,以......
  • linux cpufreq framework(5)_ARM big Little driver
    1.前言也许大家会觉得奇怪:为什么Linuxkernel把对ARMbig·Lttile的支持放到了cpufreq的框架中?众所周知,ARM的big·Little架构,也称作HMP(具体可参考“LinuxCPUcore的电源管理(2)_cputopology”中相关的介绍),通过在一个chip中封装两种不同类型的ARMcore的方式,达到性能和功耗的......
  • Python-webdriver_manager的简单使用
     提前祝大家五一快乐(*^▽^*)前言:我们在使用Selenium做UI自动化时都需要手动去下载各个浏览器版本的webdriver,有时我们可能还会遇到跨操作系统去进行测试。以及有时因浏览器自动升级等原因,导致我们不得再去更新对应版本的webdriver。为了解决以上问题,webdriver-m......
  • selenium笔记之webDriver获取浏览器控制台日志
    大家应该都听过或者用过sentry,非常好用和强大,有用户当时的各种环境,关联sourceMap后能定位到代码层面(Sentry是一个开源的错误跟踪工具,帮助开发人员监控和诊断他们应用程序中的问题。它提供实时监测、警报和分析多个平台和编程语言中的错误和异常。Sentry可以与各种框架和服务集......
  • No suitable driver found for jdbc[转]
    一是:连接URL格式出现了问题(Connectionconn=DriverManager.getConnection("jdbc:mysql://localhost:3306/XX","root","XXXX")二是:驱动字符串出错(com.mysql.jdbc.Driver)三是Classpath中没有加入合适的mysql_jdbc驱动经过我的仔细检查,这三种错误我......
  • Tailscale 基础教程:部署私有 DERP 中继服务器(转)
    Sealos 在云桌面中管理Kubernetes集群生命周期,运行分布式应用程序 走,看看去!上篇文章介绍了如何使用 Headscale 替代Tailscale官方的控制服务器,并接入各个平台的客户端。本文将会介绍如何让Tailscale使用自定义的DERPServers。可能很多人都不知道 DERP 是个啥玩意......
  • 【教程】在运行WeiPeiYang - Flutter项目时可能遇到的问题 (持续更新)
    在运行WeiPeiYang-Flutter项目时可能遇到的问题前言:本文目前的环境要求Flutter:2.8.0Dart:2.15.0保证从如下的地址克隆Q:打开项目之后发现没有Flutter的lib等文件夹确保在AndroidStudio内安装了Flutter插件,具体在File-Settings-Plugins内注意安装Flutter......
  • Loading class `com.mysql.jdbc.Driver'. 问题
     解决Loadingclass`com.mysql.jdbc.Driver'.Thisisdeprecated.Thenewdriverclassis`com.mysql.cj.jdbc.Driver'.ThedriverisautomaticallyregisteredviatheSPIandmanualloadingofthedriverclassisgenerallyunnecessary.警告问题错误提示:Loadi......