UEFI基本概念

UEFI基本概念

UEFI

1. BIOS

UEFI和之前的BIOS作用一样,只不过更先进了。一般我们自己装系统都会进BIOS,开机按F12等等,然后设置启动路径为U盘,用U盘装系统,不过现在windows支持在线更新系统了,估计U盘启动以后不需要再学了。
BIOS “Basic Input Output System” “基本输入输出系统”。 BIOS是启动时加载的第一个软件。
是固化到计算机内主板上一个ROM芯片上的程序,比如我们安了内存条,固态,开机自检就是BIOS负责的。
明确记住,BIOS也是一个程序,一个软件,只不过能和硬件直接交互。

2. UEFI

2.1 概念

统一可扩展固件接口(Unified Extensible Firmware Interface,UEFI)是一种电脑系统规格,用来定义操作系统与系统固件之间的软件界面,作为BIOS的替代方案。主要负责加电自检(POST)、联系操作系统以及提供连接操作系统与硬件的接口。
一般认为,UEFI由以下几个部分组成:

  1. Pre-EFI初始化模块
  2. EFI驱动程序执行环境
  3. EFI驱动程序
  4. 兼容性支持模块(CSM)
  5. EFI高层应用
  6. GUID磁盘分区表

先大致了解基本概念,这里需要强调的是UEFI只是一种规范,并没有具体的实现!是一种详细描述类型接口的标准。
所以定义了标准,实现就有各种各样的实现了。不同的厂商对UEFI有不同的实现,用的最多就是edk2,高通的ABL侧也是edk2,EDK2是一个遵循UEFI标准和PI标准的跨平台固件开发环境,EDK2支持多种操作系统, 也支持跨平台编译。
edk2 github官网文件夹叫tianocore/edk2。

源代码下bootable/bootloader/edk2 , 然后在此基础上做自己的改动。

2.2 SOC和UEFI

SOC和UEFI的关系可以看英特尔官网的这个对比,准确来说应该是SOC和BootLoader的关系:
https://www.intel.cn/content/www/cn/zh/support/programmable/support-resources/design-guidance/soc-bootloader.html
UEFI也属于一种bootloader的规范。fastboot就是一个UEFI应用。

2.3 高通的UEFI

这篇文章也写的不错,高通的uefi分为xbl和abl两部分,abl侧就是edk2,xbl比较麻烦,包括以前老的lk也在xbl里面。
https://www.cnblogs.com/schips/p/qualcomm_about_uefi.html

3. UEFI的编译

有几个错误,
3.1 首先需要编译 编译代码的工具
参考:https://blog.csdn.net/Lq19880521/article/details/82788367
然后又报错找不到文件,看了一下报错的文件夹是空的,应该得单独下载,网上百度了一下,果然是最近版本有问题

3.2 build

有了工具就能使用build了,build前需要先source一下,配置一下路径
编译错误,还是缺少上面那个文件夹,单独clone

JZ是累加器A判零条件转移指令

这汇编指令错误,看错误像是指令不支持,百度了一下,是nasm版本不匹配导致,但是这个报错信息完全没用啊
错误解答:https://edk2.groups.io/g/devel/topic/89637409#87359
百度nasm是什么,
Netwide Assembler (简称 NASM)是一款基于x86架构的汇编与反汇编软件。它可以用来编写16位(8086、80286等)、32位(IA-32)和64位(x86_64)的程序。 NASM被认为是Linux平台上最受欢迎的汇编工具之一。

终端无法更新nasm,只能去网站下载,本地编译安装
https://www.nasm.us/pub/nasm/releasebuilds/2.15.05/
再次build,成功,哦对了,我这里修改了默认的编译平台,如果不修改的话,估计还是报错,需要指定平台和架构,看edk2官网的教程就可以。

3.3 文件后缀的含义

fdf:flash definitionfile,描述flash分区地址范围
dec:package declarationfile,定义了不同模块的GUID信息
dsc:description file,主要包含需要用到的所有inf文件
inf:单个模块的编译信息,类似makefile
efi :最终编译生成的UEFI可执行文件

4.编译错误

Python3.9的错误。使用Python3.8
https://bugzilla.redhat.com/show_bug.cgi?id=1863473

5. 构建自己的HelloWorld.

edk2里的代码最小组成都是按模块(module)来划分,n个模块可以组成一个包(package),平台(platform)是一种特殊的package,一般都是编译的入口。
module有个inf文件描述这个module,package有个dec文件,platform则是dsc文件。还有个fdf文件用作flash用。
module可以是application,library,or driver。
Library有个class和instance,class就是一个抽象,instance负责具体实现,不同平台可以定义不同实现。
Driver只接触了DXE drv, 提供protocol供其他module使用。dxe,驱动执行环境
Application和Driver区别是是否退出。
package之间还可以互相引用,just like C calling eath other.

参考这篇文章,,
https://martins3.github.io/uefi/uefi-linux.html
当然遇到了各种错误,一步步解决,这里不建议修改conf/target.txt,因为修改只是暂时的,频繁修改不如直接build -p
源码需要修改,很简单

#include <Include/Uefi.h>
#include <Library/UefiLib.h>

EFI_STATUS
EFIAPI
UefiMain (IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable) 
{
    Print(L"Hello World!\n");

    return EFI_SUCCESS;
}

这里还需要写自己的shell才能运行efi

#!/bin/sh
set -e

dd if=/dev/zero of=uefi.img bs=512 count=93750
sgdisk -n 1 -t 1:ef00 -c 1:"EFI System Partition" uefi.img
dd if=/dev/zero of=part.img bs=512 count=91669
mformat -i part.img -h 32 -t 32 -n 64 -c 1
mcopy -i part.img HelloWorld.efi ::
dd if=part.img of=uefi.img bs=512 count=91669 seek=2048 conv=notrunc
sgdisk -p uefi.img

#qemu-system-x86_64 -cpu qemu64 -bios /usr/share/ovmf/OVMF.fd -drive file=uefi.img,if=ide -net none
qemu-system-x86_64 -cpu qemu64 -bios Build/OvmfX64/DEBUG_GCC5/FV/OVMF.fd -drive file=uefi.img,if=ide -net none

6. 源码分析

MBR ,GUID是硬盘分区格式
BIOS,UEFI是主板引导方式

UEFI(Unified Extensible Firmware Interface)【统一可扩展固件接口】
BS(Boot Services)【启动服务】
RT(Runtime Service)【运行时服务】
SEC(Security Phase)安全认证
PEI(Pre-EFI Initialization)UEFI 前期初始化
DXE(Driver Excution Environment)驱动执行环境
BSD(Boot Device Selection)启动设备选择
TSL(Transient System Load)操作系统加载器
RT(Run Time)系统运行时
AL(After Life)

UEFI四个主要阶段简介

SEC(Security Phase/安全验证)
接受并处理系统启动和重启信号:系统加电、重启、运行异常信号
初始化临时存储区域:CAR(Cache As Ram),Cache被配置为no-eviction模式
作为可信系统的根
传递参数给下一阶段:系统当前状态
可启动固件(Boot Firmware Volume)的
临时RAM区域的地址和大小
栈的地址和大小

PEI(Pre-EFI Initialization/EFI前期初始化)
为DXE准备执行环境:将需要传递到DXE的信息组成HOB(Handoff Block)列表
PEI内核(PEI Foundation):负责PEI基础服务和流程
PEIM(PEI Module)派遣器:找出系统中所有PEIM,并根据其依赖关系按顺序执行PEIM;PEI阶段对系统的初始化主要是由PEIM完成的

DXE(Drive Execution Environment/驱动执行环境)
执行大部分系统初始化工作
DXE内核负责DXE基础服务和执行流程
DXE派遣器负责调度执行DXE驱动,初始化系统设备
DXE提供的基础服务包括系统表、启动服务、运行时服务(Run Time Services)

DXE阶段的执行
源码结构
MdeModulePkg/
Core/
Dxe/
Dispatcher/ DXE调度器
DxeMain/ DXE阶段入口函数
Event/ 异步事件机制
FwVol/ 闪存文件系统FFS
FwVolBlock/ 闪存的块操作
Gcd/ 全局配置数据库
Hand/ 句柄Handle
Image/ 镜像文件服务,加载、解析和执行
Library/ 库函数,三个与lock相关的操作
Mem/ 内存服务,申请和释放
Misc/ 其他内容,看门狗、
SectionExtrantion/
DxeCore.uni 字符串数据
DxeCoreExtra.uni 字符串数据
DxeMain.h 头文件
DxeMain.inf 模块信息文件

DXE入口函数接收PEI阶段构建的HOB(Hand Off Block)数据;HOB数据格式的定义位于/MdePkg/Include/Pi/PiHob.h
DXE阶段主要使用的几类HOB数据:
1、EFI_HOB_TYPE_RESOURCE_DESCRIPTOR 可用内存资源信息:用于初始化内存申请与回收服务,提供申请和回收内存的方法
2、EFI_HOB_MEMORY_ALLOCATION DXE模块数据:用于初始化镜像服务,提供加载、解析和执行文件的方法
3、EFI_HOB_TYPE_FV 内存卷信息:对每一个内存卷建立一个PROTOCOL用于读取数据,所有的驱动数据从这里面读取,然后调度执行

BDS(Boot Device Selection/启动设备选择)
执行启动策略
初始化控制台设备
加载必要的设备驱动
根据系统设置加载和执行启动项

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值