UEFI开发和调试
介绍UEFI的开发环境搭建,开发调试方法,以及运行原理。
程序猿Ricky的日常干货
擅长扫地、打杂、开车。。
展开
-
UEFI开发与调试---ImageHandle和ControllerHandle
1.ImageHandle每个uefi module都是一个image,而每个image对应都有一个ImageHandle,其实ImageHandle的类型就是EFI_HANDLEtypedef VOID *EFI_HANDLE;因此实际上每个ImageHandle是一个void*指针,那么也就是说任何结构体都可以传给他,其实通过代码可知在ue...原创 2018-08-03 17:25:40 · 3861 阅读 · 0 评论 -
UEFI开发与调试---文件操作
和存储器相关的Protocol有BlockIo,BlockIo2,DiskIo,DiskIo2。DiskIo/DiskIo2的实现分别依赖与BlockIo/BlockIo2,其中BlockIo,DiskIo提供了访问设备的阻塞函数,BlockIo2,DiskIo2提供异步函数。。它们的区别是BlockIo只能按照扇区为单位访问存储器,而DiskIo可以按照字节为单位访问。UEFI也会为每个分区生成...原创 2018-06-22 17:46:52 · 3609 阅读 · 1 评论 -
UEFI开发与调试---事件的处理
UEFI SPEC目前不支持多线程,是单线程环境,但是它必须提供一种异步机制来支持有限多任务。UEFI不再为开发者提供中断支持,也就是说我们无法利用UEFI提供的接口设置中断服务程序,那么如果来实现异步操作呢?那就用到了本章所介绍的事件(Event)功能,UEFI提供了对事件Event的支持,Event的内部实现当然也是依赖与中断的。事件的支持是由BootServices启动服务表提供的。...原创 2018-06-22 16:00:47 · 3661 阅读 · 0 评论 -
UEFI开发与调试---运行阶段介绍
UEFI的运行可以分为如下几个阶段:SEC阶段 此阶段是安全验证阶段,系统上电后即进入此阶段,作为UEFI的第一阶段,它是可信系统的根,一般可以在此阶段验证后面的PEI,此阶段大部分工作是为后面的PEI阶段提供运行环境。PEI阶段 PEI(Pre-EFI-Initialization)是EFI前期初始化阶段,资源依然十分有限,内存到了PEI后期才被初始化,其主要功能是为DXE准备执行环...原创 2018-06-22 11:39:22 · 1963 阅读 · 0 评论 -
UEFI开发与调试--edk2中的基础组件
还记得前面介绍的MdePkg和MdeModulePkg吗?这两个包中会实现UEFI内核中的基础组件,其中就包括了系统表,启动服务表,运行时服务表。系统表(System Table)系统表是edk2提供的一个最重要也是最基础的数据结构之一,它是沟通内核和应用/驱动的桥梁。通过系统表,应用程序和驱动才能够访问到内核和硬件资源。系统表包含了如下信息: - 表头 - 固件信息 - ...原创 2018-06-22 10:57:24 · 4178 阅读 · 0 评论 -
UEFI开发与调试---edk2中的应用模块/库模块/驱动模块
应用模块应用模块包含标准应用程序模块,shell应用程序模块,以及main应用程序模块标准应用程序模块 它是所有其他应用程序模块的基础,作为一个模块来说,同样由源文件和工程文件(.inf)组成。 它的特征如下:(1) .inf中的ENTRY_POINT一般设置为UefiMain,这是一个约定俗称的名字,所以这个规则并不是一定的。(2) 指定的ENTRY_POINT入口函数必须要...原创 2018-06-21 17:42:51 · 3108 阅读 · 2 评论 -
UEFI开发与调试---edk2中的Module
Edk2在设计是按照模块来进行的,其中模块包含有很多种类型,比如最常见的三种:应用程序模块,驱动模块,库模块。每个模块都包含了一个工程元数据文件(.inf)和源文件。.inf文件是用来辅助编译的,功能类似于Makefile;而源文件就是功能代码的实现了。本文主要用来介绍.inf的编写规则。类似于前文介绍的.dsc和.dec文件,工程元数据文件(.inf)也是由一系列块组成,它们有一些是必需块:...原创 2018-06-21 15:02:38 · 2748 阅读 · 1 评论 -
UEFI开发与调试---edk2中的Package
在开始编写UEFI APP之前,我们需要先对UEFI包和模块的概念有个了解。在edk2的根目录下,我们可以发现有很多*Pkg命令的目录,这些实际上都是各个不同的包,每个包中都是一组模块的集合,每个包中都有对应的描述文件(.dsc),声明文件(.dec)。当然如果这个包是用来生成固件Image或者Option Rom Image,那么这个包还需要包含一个.fdf文件(Flash Descript...原创 2018-06-21 14:57:17 · 7430 阅读 · 0 评论 -
UEFI开发与调试---edk2中子目录介绍
AppPkg UEFI Application Development Kit是一系列用来进行uefi app开发的套件,标准依赖库,工具以及demo,目标是降低UEFI app的开发门槛。MdePkg 全称为“Module Development Environment Package”,这是一个特殊的package,包含了用于开发一个module所需要的最小环境。一个module可能也...原创 2018-06-21 14:38:50 · 5348 阅读 · 0 评论 -
UEFI开发与调试---利用QEMU虚拟盘调试UEFI APP
由前文我们知道如何制作qemu虚拟盘了,那么对于UEFI的开发者,也可以通过虚拟盘来模拟启动过程,或者方便自己uefi app的调试。当我们制作好了虚拟盘之后,后续可以通过编译生成uefi app,然后把app放到虚拟盘中并更新,即可快速调试和验证,这种方式的优点是不用重复编译整个UEFI OVMF系统。QEMU可以支持很多种文件格式,下面将以qcow2和raw两种格式的镜像为例进行讲解。需要...原创 2018-06-21 14:24:45 · 7237 阅读 · 4 评论 -
UEFI开发与调试---QEMU虚拟盘的创建与修改
支持的文件格式qemu支持多种类型的文件系统,而最原生的以及最灵活的是qcow2类型了,这种文件系统支持写时复制,加密,压缩以及VM快照。 除了这种文件系统之外,如下类型也是被支持的:raw ,cloop ,cow,qcow,vmdk ,vdi ,vhdx,vpc 等等,每个版本会有一些差别,具体参考对应的Document文档。虚拟盘的创建方法既然qemu支持很多中类型的文件系统,...原创 2018-06-21 14:21:56 · 3195 阅读 · 0 评论 -
UEFI开发与调试---OVMF 固件简介
OVMF (Open Virtual Machine Firmware ) 旨在支持虚拟机启动的一套edk2 Package。目前支持如下特性:Current capabilities:* IA32 and X64 architectures* QEMU (0.10.0 or later) - Video, keyboard, IDE, CD-ROM, serial ...原创 2018-06-21 14:19:04 · 8923 阅读 · 13 评论 -
UEFI开发与调试---开发环境搭建
EDK2全称为“uEFI Development Kit”,是intel开源的一套符合UEFI标准的实现。edk2环境搭建代码下载github:https://github.com/tianocore/edk2.gitgit clone https://github.com/tianocore/edk2.git安装编译环境sudo apt-get inst...原创 2018-06-21 14:15:28 · 6975 阅读 · 0 评论 -
代码分析UEFI的执行流程
UEFI的运行阶段本文的分析只会涉及到DXE之后的阶段,前面的略过。DXE 阶段DXE阶段的实现函数在edk2的MdeModulePkg/Core/Dxe/DxeMain目录中,主入口函数为: VOID EFIAPI DxeMain ( IN VOID *HobStart ){...... gBds->Entry (gBds); //DXE的最后调用B...原创 2019-09-03 20:37:04 · 3923 阅读 · 1 评论 -
edk2中的fdf文件简介
fdf的全称叫做flash device file,它用于描述固件在flash中的布局和位置,他可以分为几个部分[Defines],[FD],[FV],[Rule],本文主要介绍如下关键的3个部分:FD Section用于描述一个flash device,这个部分需要在起始的地方标注[FD]。 ###############################################...原创 2019-09-30 19:00:48 · 4515 阅读 · 1 评论