我对PC固件编程很感兴趣,我只是在研究UEFI规范.令我惊讶的是,它似乎是嵌入固件的整个操作系统的规范.您甚至可以编写UEFI"应用程序",它们直接使用UEFI引导服务运行,而不存在任何其他操作系统.
我找到了博客文章,展示了如何创建"Hello,world!" 可以在UEFI预引导环境中运行的应用程序.这很有趣,同时也很奇怪.我将在常规操作系统上运行我的"Hello,world"程序,谢谢.
UEFI应用程序实际上有哪些用例?花哨的启动配置屏幕?任何"真正的"商用PC固件是否使用UEFI应用程序来实现除引导加载程序和引导配置实用程序之外的任何其他功能?
尽管这里有许多有价值的答案,因为我自己写了几个UEFI应用程序,我会尝试加上我的2美分.首先,什么是UEFI应用程序,只是让我们谈论的是:
UEFI Specificatin v2.5:
第2.1.1节
图像类型之间的主要区别是固件将图像加载到的内存类型,以及图像的入口点退出或返回时采取的操作.从图像的入口点返回控件时,始终会卸载应用程序映像.
第2.1.2节
当应用程序从其入口点返回时,或者当它调用引导服务EFI_BOOT_SERVICES.Exit()时,将从内存中卸载应用程序,并将控制权返回给加载应用程序的UEFI组件.
在UEFI中有意义的应用程序组:
EFI_BOOT_SERVICES.ExitBootServices()导致终止所有内存管理并将控制传递给操作系统.请注意,UEFI应用程序的一个非常重要的功能是它可以添加到引导顺序并在每个引导时执行.此外,UEFI应用程序不必与BIOS映像一起提供,它可以存储在连接的设备存储器中,这对于Option ROM配置工具是常见的.
小智 8
任何不是PEI/DXE/SMM核心或驱动程序的东西都是一个应用程序,所以任何"真正的"PC都有它们,因为BIOS Setup实际上是一个UEFI应用程序.一些供应商包括各种其他应用程序,如固件更新程序,诊断和故障排除实用程序等.UEFI 2.4可以使用正确填充的BootXXXX/KeyXXXX变量对添加您自己的应用程序,然后在POST期间按键组合运行它.
用C编写的大多数控制台应用程序可以使用当前EFI开发工具包的StdLib包编译为UEFI应用程序,然后在UEFI shell中运行.
有用的UEFI应用程序(除了引导程序,shell和Linux内核,当然还有)的主要示例是Intel ME System Tools,Read Universal,Python 2.7等等.
最终,当旧版引导不再可用时,所有当前有用的DOS实用程序必须成为UEFI应用程序或灭绝.
这是一个完整的UEFI预启动应用程序的示例;
有SED SSD/HDD驱动器.一旦SSD/HDD断电,它就会进入锁定状态(基于硬件的加密).您无法访问驱动器的数据,驱动器上的所有分区都不再可见.只有小型只读分区(ShadowMBR)可用.UEFI固件从唯一可用的分区引导UEFI应用程序(在初始化过程期间以及在获取SED的所有权时,UEFI应用程序写在该分区上).它安全地验证用户身份,如果凭据有效,则解锁驱动器.当驱动器解锁时,Shadow MBR消失,驱动器上的所有分区都可用.然后App链启动已安装的操作系统.
因此,如果您没有凭据,则甚至无法启动操作系统,也无法以任何方式访问驱动器上的数据.
小智 5
下面是几个例子:
https://github.com/NikolajSchlej/CrScreenshotDxe UEFI DXE 驱动程序从兼容 GOP 的图形控制台截取屏幕截图(是的,您可以制作 BIOS 的 PNG 屏幕截图并保存)
http://ruexe.blogspot.com/ RU.EFI 是一个相当先进的 BIOS 调试工具
| 归档时间: |
|
| 查看次数: |
11840 次 |
| 最近记录: |