1.UEFI开发探索57-如使用最新的源码EDK2搭建编译环境
2.UEFI与硬件初始化
3.UEFI之 Secure boot
4.UEFI开发环境搭建
5.UEFI开发探索43 – Protocol的使用2
6.UEFI开发探索15 – 图形模式下文字显示
UEFI开发探索57-如使用最新的EDK2搭建编译环境
在探索UEFI开发过程中,作者注意到EDK2的泄露发布方式发生了变化,不再提供定期打包的源码源代码。这影响了作者的泄露开发流程,因为打包的源码源码通常包含整理好的API文档和预配置的环境。因此,泄露整体下载网站源码作者决定直接从github的源码EDK2主线仓库下载并搭建最新的编译环境。
首先,泄露需要将github上的源码EDK2、edk2-platforms、泄露edk2-libc等关键项目导入到gitee仓库,源码并关注一些必要的泄露子模块,如openssl、源码berkeley-softfloat-3等。泄露确保安装好Visual Studio、源码Python、ASL和Nasm等编译工具后,通过Git Bash下载并克隆私有仓库中的源代码。
具体步骤包括:新建工作目录,克隆仓库,修改.edkmodules文件指向gitee仓库地址,然后更新submodules。编译环境搭建完成后,通过edksetup.bat命令编译BaseTools,接着使用mybuild.bat批处理文件保持目录结构清晰并编译UEFI程序。值得注意的是,新版本的EDK2(如年3月)移除了NTPkg,增加了位程序支持的聚合cnd源码EmulatorPkg,这使得调试位代码变得更加方便。
通过以上操作,开发者可以了解到如何使用最新的EDK2搭建和维护自己的编译环境,以便进行UEFI开发。
UEFI与硬件初始化
UEFI论坛的PI规范通过模块化方法支持芯片和硬件平台的初始化,涉及系统初始化、引导和引导前的特殊配置。BIOS领域采用UEFI后,其影响力显著,现已成为固件、操作系统和其他行业标准不可或缺的组件。在Intel架构的PC生态系统中,UEFI规范或其后续的PI规范成为硬件初始化的核心基础。
本文将探讨如何利用UEFI平台初始化(PI)规范来构建和配置芯片和硬件。我们会深入理解规范的构建模块,涉及平台启动流程、特殊模式和常见应用场景,还会关注处理器、内存和图形控制器等硬件的驱动程序。PI规范的普及得益于其二进制兼容性、源代码实现、开源工具支持以及广泛接受的测试标准。
PI规范的出现标志着BIOS角色的转变。它允许芯片供应商提供一次开发、多处使用的初始化代码,解决了过去不同公司基于芯片文档自行开发初始化代码的问题。同时,少好源码PI规范使得硬件和固件的部署更加无缝,促进了BIOS生态系统中各参与者角色的整合和责任划分,提高了可测试性和驱动程序的互操作性。
举例来说,PI规范支持像SMBus这样的系统管理总线,提供了标准化的API接口,使得开发者无需深入硬件细节即可使用。这不仅提高了效率,也确保了跨平台的兼容性。UEFI PI规范就像一个模块化菜单,允许开发者按需组合,提升硬件和固件的开发灵活性。
尽管UEFI PI提供了基础框架,但特定小型组件的开发仍需单独处理。总的来说,PI规范为构建高质量固件奠定了基础,使得BIOS工程师的工作更加系统化和高效。
UEFI之 Secure boot
UEFI Secure Boot详解
Secure Boot的目标在于防范恶意软件入侵,其核心机制是通过UEFI固件内置的公钥进行软件验证。主板出厂时预装的公钥,确保只有经过私钥签名的操作系统和驱动才能加载,从而阻止未授权软件侵入引导过程,确保Boot的安全性。 证书颁发机构,如OEM或其授权的Microsoft,会生成密钥对,并使用私钥对合法的如何搬运源码启动模块和固件服务进行签名。UEFI固件内置的公钥则负责验证这些操作,确保其来源的可信性。 密钥生成和签名过程涉及私钥PK.key、公钥PK.crt,以及用于UEFI setupUI的.cer证书。对于Hello.efi这类EFI文件,需要使用私钥db.key及其对应公钥db.crt进行签名,如需对内核vmlinuz进行签名,同样采用上述步骤,但vmlinuz因其非启动EFI文件,签名影响不大。 sbsigntools工具是用于签名.efi文件的,可能需要针对Loongarch架构进行源码编译以解决不支持问题。在UEFI中,验证流程按照grub加载kernel,kernel加载module的顺序进行,确保每个文件都通过验证。 开启Secure Boot后,BIOS会使用内置的公钥验证启动文件,如未签名,会导致无法加载。要在Secure Boot启用后仍能访问U盘shell,需对bootx.efi进行签名,并将签名私钥的公钥包含在BIOS设置中。 在EDK源码中,通过SECURE_BOOT_ENABLE编译选项启用Secure boot功能,并在LibraryClasses中添加相关依赖。gcc程序源码开启后,需确保Variable空间足够大以存储证书。 Secure boot的实现涉及多个关键组件,如PlatformSecureLib、TpmMeasurementLib、AuthVariableLib等,它们通过一系列接口和验证逻辑来确保启动流程的安全。不同的二进制文件策略根据PcdFixedMediaImageVerificationPolicy等配置进行处理。 最后,为了支持Secure boot,硬件需支持UEFI,操作系统则需提供相应的证书/密钥支持。Linux内核模块签名机制确保模块的安全性,而UEFI系统如Ubuntu和Red Hat会检查内核映像的签名以启用安全启动。UEFI开发环境搭建
UEFI开发环境搭建涉及软件安装、源码编译与UEFI固件运行。首先,需要安装Visual Studio ,并确保选择了合适的开发组件。接着,下载并解压IASL和NASM至根目录,注意修改edk2中的conf/tools_def.txt以适应不同路径。至此,构建EDK2的环境搭建完成。
接下来,从gitcode.com/tianocore/edk2下载源码,切换至稳定版本进行编译。过程中,可能会遇到edksetup.bat脚本报错问题,这是因为Base Tools未生成。需手动编译Base Tools,注意下载并放置brotli工具源码至BaseTools/Source/C/BrotliCompreaa/brotli目录下。再次执行rebuild操作,通常能解决报错问题。
对于新版本EDK2,build工具不再使用exe版本,而是Python版本。因此,需设置Python相关变量。完成后,构建UEFI固件(如选择OVMF)二进制,通常结果为成功。
最后,将OVMF.fd文件复制至QEMU的固件库中。在相应目录下,打开CMD命令行,使用指定命令启动虚拟机,即可进入UEFI模拟环境。至此,UEFI开发环境搭建完成。
UEFI开发探索 – Protocol的使用2
今天探索如何开发UEFI服务中的Protocol。在《UEFI原理与编程》一书中,已有关于UEFI服务开发的介绍,以视频解码为例,提供了完整的解码库。考虑到视频解码的兴趣不高,我将构建一个用于在屏幕上绘制几何图形的简单框架型代码,以熟悉Protocol开发。
UEFI驱动大致分为两类:符合UEFI驱动模型的驱动和不遵循UEFI驱动模型的驱动。服务型驱动不管理设备,产生协议,初始化操作后即从系统内存中卸载;初始化驱动不产生任何句柄,仅进行初始化并返回错误代码;根桥驱动产生句柄,包含设备路径协议和I/O资源抽象协议;UEFI驱动模型驱动包含多个句柄、协议实例,支持子句柄和额外I/O协议。
服务型驱动作为开发Protocol的起点,比较简单,主要用于生产协议。实例包括AcpiTableDxe、DebugSupportDxe等。这类驱动在模块初始化时安装所需协议。以HiiResourcesSampleDxe为基础,构建了一个服务型驱动框架,修改了*.inf文件,调整为UEFI_DRIVER类型,并加入UefiDriverEntryPoint。构建好Protocol后,在驱动入口函数中安装。
构建Protocol需准备三个部分:Protocol GUID(使用微软工具或在线生成)、协议成员函数与结构体、实例化协议。成员函数需EFIAPI修饰,第一个参数为This指针。构造好的Protocol源代码展示了其结构。可以通过This指针传递内部私有数据,实现函数间的共享。
为了测试,编写了服务驱动提供Protocol与测试程序。服务驱动中提供的Protocol包含三个成员函数,用于演示。通过命令加载服务驱动并测试协议,结果验证了自定义Protocol的正确性。
具体实现与测试代码在文末提供下载链接。服务驱动中提供的Protocol具有简单的打印功能,用于展示。测试结果显示,安装自制协议后,测试程序能正确调用成员函数。
Gitee项目地址:gitee.com/luobing/u...,项目代码位于FF RobinPkg下的Applications目录和Drivers目录,包括TestServiceDrvSample和ServiceDrvSample。
UEFI开发探索 – 图形模式下文字显示
UEFI中利用HII(Human Interface Infrastructure)进行图形界面的文字显示,是一种处理方式。然而,作者之前在进行开发时,没有深入研究这一方法。在项目中,作者采用的是自定义方法,比如在测试样卡界面的实现中,英文和汉字的显示并非通过HII,而是通过Foxdisk中的显示方法,这方法简单直接,将汉字和英文字符看作一个个字模,使用画点函数进行绘制。
HII的使用方式可能不那么直观,作者在面临时间紧迫的开发任务时,决定采用Foxdisk中的显示方法,因为这方法可以快速实现所需功能。对于汉字和英文字符的显示,作者使用了8×像素的英文字符,直接拷贝到程序中编译,而对于汉字,作者编写了一个工具程序来提取字模,这个工具程序只能在位dos下运行,通常在位winxp的cmd环境中使用,理论上在win7 位环境也应该可以运行,因为它主要处理文件内容,并未涉及硬件相关代码,使用Borland C++ 3.1编译。
为了适配不同操作系统和环境,作者近期考虑使用Python重写这些工具软件,以方便在位操作系统下直接运行。尽管作者对这项目持开放态度,但是否会实际进行还未能确定。
作者使用的工具程序主要包括DistillHZ和DisTillLOGO。DistillHZ可以自动生成UEFI程序所需字符串的字模文件,并转换为UEFI程序可使用的格式,而DisTillLOGO则直接从Foxdisk的工具程序中拿来使用,但Logo的提取功能还需手动调整大小,并未完全考虑各种情况,如bmp文件的对齐问题等。
在显示汉字方面,作者采用与Foxdisk中相似的原理和方法,通过DistillHZ提取汉字字模和字符串,然后将字模文件复制到Font.c中,与Font.h中的数据结构和显示函数结合使用,以实现汉字的显示。对于Logo的显示,作者采用从色bmp图中提取像素点,然后逐点显示的简单方法。
最终,UEFI程序的显示效果良好,通过代码列表可以看到,其中的源代码名称与Foxdisk中的保持一致,汉字显示函数以及各种图形的显示函数与Foxdisk中的实现完全相同,因此,Foxdisk中的某些有趣效果,如渐隐和透明效果等,也可以直接应用于UEFI中。
2024-11-30 04:39
2024-11-30 04:36
2024-11-30 04:31
2024-11-30 04:16
2024-11-30 03:55
2024-11-30 02:44