ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

UEFI编程基础

2021-12-10 23:00:55  阅读:223  来源: 互联网

标签:文件 模块 编程 基础 编译 UEFI OVMF 固件


UEFI编程基础

目录

01 简介

UEFI启动流程

image

SEC PEI DXE BDS TSL RT AL

image

  • Windows Boot Manager

安装完Windows系统后而出现的启动选项
(相关的信息存储在NVRAM, NVRAM是BIOS ROM中的一段区域,一般定义为 64k byte, 现在EFI把所有的变量都存在这里。),
可以删除和建立,和bcdboot.exe有关;
在BDS阶段,固件会默认引导Windows启动管理器。
默认情况下,UEFI固件加载的启动文是EFI\BOOT\bootx64.efi(bootia32.efi),
而Windows强制写入的启动项则会加载EFI\MICROSOFT\BOOT\bootmgfw.efi,这两个文件其实是一模一样的文件。

  • Bootmgfw.efi

引导Windows的引导文件

  • Bootx64.efi

UEFI的必需引导文件(windows下本质为bootmgfw)

UEFI开发环境搭建

02 UEFI开发环境搭建

1 、下载EDKII UEFI的跨平台固件开发环境

git clone –recursive https://github.com/tianocore/edk2.git

image

2 、安装nasm

下载nasm

https://www.nasm.us/pub/nasm/releasebuilds/2.15.05/win64/nasm-2.15.05-installer-x64.exe

image

配置环境变量

NASM_PREFIX=C:\nasm-2.15.05\

image

3 、安装ASL

ASL Compiler
https://acpica.org/sites/acpica/files/iasl-win-20210331.zip
将iasl.exe放到c:\ASL\ 目录下

image

4 、安装python 3

安装python3 ,并配置环境变量PYTHON_HOME

image

5 、安装Cygwin

安装Cygwin
http://www.cygwin.com/setup-x86_64.exe
修改edk2\BaseTools\Conf 目录下的target文件
edk2\Conf(未编译时目录为空,编译时根据上面目录的文件生成,后续编译使用此目录下文件)

配置处理器架构和编译工具链
image

配置环境变量CYGWIN_HOME

image

6 、配置编译参数

edk2\Conf(未编译时目录为空,编译时根据上面目录的文件生成,后续编译使用此目录下文件)
配置处理器架构和编译工具链

image

7 、编译

  1. 执行edksetup.bat,配置编译运行环境

  2. 执行build命令进行编译(编译时使用target文件内的配置,不指定其他参数时编译EmulatorPkg,uefi模拟器)
    image
    image
    image

8 、编译参数

build -a X64 -p [ACTIVE_PLATFORM] -m [指定模块.inf]

9 、运行

一、Emulator模拟器
二、OVMF 运行方式
三、pe U盘

一、模拟器运行

使用build命令默认编译Emulator模拟器,路径:
edk2\Build\EmulatorX64\DEBUG_VS2019\X64\WinHost.exe

image

Tips:需要使用英文键盘,否则程序失去焦点

image

二、OVMF

OVMF(Open Virtual Machine Firmware,开放虚拟机固件)是用于虚拟机上的UEFI固件。

编译参数

build -a X64 -p OvmfPkg\OvmfPkgX64.dsc edk2\Build\OvmfX64\DEBUG_VS2019\FV\OVMF.fd

Qemu运行参数

qemu-system-x86_64.exe -bios "OVMF.fd" -M "pc" -m 256 -cpu "qemu64" -vga cirrus -serial vc -parallel vc -name "UEFI" -boot order=dc

Qemu Manager运行

image

03 UEFI hello world

UEFI 工程模块文件

包(Package)和模块(Module)
包(package) :包是一组模块和平台描述文件(.dsc文件)、包声明文件(.dec文件)组成的集合。在EDK 2 根目录下,有很多以*pkg命
名的文件夹,每一个这样的文件夹称为一个package。
模块(module) :由元数据文件(工程文件即.inf文件)和源文件(.c .asm .uni .vfr, 有些情况可包含.efi文件)组成。模块(可执行文件,即.efi文件)像插件一样可以动态的加载到UEFI内核中。
包相当于vs中的项目,.dsc文件相当于vs项目中的.sln文件
模块相当于vs中的工程,.inf文件相当于vs项目中的.vcxproj文件

开发UEFI 应用程序

image

模块.inf文件

image

image

包 .dsc文件

.inf用于编译一个模块,.dsc用于编译一个Package,
包含了[Defines] 、 [LibraryClasses] 、 [Components] 等几个必须部分
以及[PCD]、[BuildOptions]等可选部分。
[Defines]块:必须是.dsc文件的第一个部分,用于设置build相关的全局宏变量。

image

[LibraryClasses] 块:定义了库的名字以及库.inf文件的路径。这些库可被[Components]块内的模块引用。
image

[Components] 块:在该区域内定义的模块都会被build工具编译并生成.efi文件。
image

.dec文件定义了公开的数据和接口,供其他模块使用。

包含了必须区块:[Defines],
可选区块:[Includes]、[LibraryClasses]、[Guids]、[Protocols]、[Ppis]和[PCD]几个部分。
[Defines] :用于提供package的名称、GUID、版本号等信息。
[Includes] :列出了本package提供的头文件所在的目录。
[LibraryClasses] :Package可通过.dec文件对外提供库,每个库都必须有一个头文件,放在Include\Library目录下。本区块用于明确库和头文件的对应关系。
image

编译UEFI 应用程序

image

运行UEFI 应用程序

image

04 UEFI调试环境搭建

注册默认调试器

Visual Studio:   "C:\WINDOWS\system32\vsjitdebugger.exe" -p %ld -e %ld

image

软件断点

通过插入软件断点调试模拟器

image

image

image
image

__debugbreak

OVMF固件调试

0 、编译OVMF.fd(启用调试)

一、安装windbg

二、安装Intel UDK Debugger Tool

https://software.intel.com/sites/default/files/managed/de/00/UDK_Debugger_Tool_v1_5_Win.zip

三、配置SoftDebugger.ini

(位于C:\Program Files (x86)\Intel\Intel(R) UEFI Development Kit Debugger Tool\)

四、配置qemu参数

-serial tcp:localhost:20716,server
image

image

OVMF调试资料

How to debug OVMF with QEMU using WinDbg · tianocore/tianocore.github.io Wiki

Ovmf source level debug - S!mon SAYS (damn99.com)

小華的部落格: Intel® UEFI Development Kit Debugger Tool (Intel UDK Debugger and OVMFPkg) (biosengineer.blogspot.com)

UEFI资料

2015 Hacking Team
hackedteam/vector-edk: EFI Development Kit

英特尔 ATR 培训:从攻击者和防御者的角度来看,BIOS/UEFI 系统固件的安全性
enascimento/firmware-security-training: Intel ATR Training: Security of BIOS/UEFI System Firmware from Attacker and Defender Perspectives

固件笔记 mytbk/firmware_notes: some notes aboutfirmware(BIOS,UEFI,coreboot,routers,embedded system,etc.)

Disable PatchGuard and DSE at boot time
Mattiwatti/EfiGuard: Disable PatchGuard and DSE at boot time

A tool for UEFI firmware reverse engineering
yeggor/uefi_retool: A tool for UEFI firmware reverse engineering

Hyper-V Hacking Framework For Windows 10 x64 (AMD & Intel)
_xeroxz / Voyager · GitLab (githacks.org)


唉,有半年没搞了,忘没了,0.0 不知道整天忙活了个啥子。

标签:文件,模块,编程,基础,编译,UEFI,OVMF,固件
来源: https://www.cnblogs.com/DirWang/p/15674148.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有