没有合适的资源?快使用搜索试试~ 我知道了~
首页《UEFI内核导读》-样章20211105.pdf
《UEFI内核导读》-样章20211105.pdf
需积分: 48 275 浏览量
更新于2023-05-28
评论
收藏 6.15MB PDF 举报
《UEFI内核导读》-样章2021/11/05更新 第23篇Secure Boot简介 133 第24篇Open source UEFI BIOS开发实战简介 139 第25篇 How to rotate Screen 143 第26篇Platform Environment Control Interface简介 146
资源详情
资源评论
资源推荐

《UEFI 内核导读》
做知识的搬运工
Cstyle _编著

UEFI 内核导读
2
目录
序 .................................................................................................................................................................... 3
第 0 篇 SEC Reset Vector ..................................................................................................................... 4
第 0.1 篇 SEC Core 简介 ......................................................................................................................... 9
第 1 篇 PEI Core 简介 ........................................................................................................................... 13
第 1.1 篇 PEI Image Service ............................................................................................................ 14
第 1.2 篇 PEI Notify ............................................................................................................................ 17
第 2 篇 Dxe Core 简介 ........................................................................................................................... 30
第 2.1 篇 Event and Timer 简介 ...................................................................................................... 31
第 2.2 篇 Event and Timer 原理 ...................................................................................................... 38
第 2.3 篇 Driver 实例及私有数据 .................................................................................................... 41
第 3 篇 BDS Core 简介 ........................................................................................................................... 44
第 4 篇 Runtime Core 简介 .................................................................................................................. 44
第 5 篇 UEFI Drivr binding .............................................................................................................. 45
第 6 篇 PCI Driver Stack ................................................................................................................... 47
第 7 篇 USB Driver Stack ................................................................................................................... 54
第 8 篇 Graphics Driver Stack ........................................................................................................ 61
第 9 篇 Text Console Driver Stack .............................................................................................. 67
第 10 篇 Mass Storage Driver Stack ............................................................................................ 72
第 11 篇 ATA Driver Stack ................................................................................................................. 75
第 12 篇 Load File Driver Protocol ............................................................................................ 78
第 13 篇 UEFI Driver and Controller Name .............................................................................. 79
第 14 篇 User Credential Driver Stack ..................................................................................... 86
第 15 篇 UEFI Driver Configuration ............................................................................................ 87
第 16 篇 Driver Diagnostics ............................................................................................................ 92
第 17 篇 Override Protocol .............................................................................................................. 99
第 18 篇 Embedded Controller 简介.............................................................................................. 108
第 18.1 Embedded Controller 链接过程 .................................................................................... 112
第 18.2 Embedded Controller Share ROM ................................................................................. 116
第 19.0 篇 NVRAM 的工作原理简介 ................................................................................................. 120
第 20.0 篇 SMM 在 UEFI 当中的实现 ............................................................................................... 123
第 21.0 篇 IGD OpRegion interface && IGD OpRegion PROTOCOL ................................. 127
第 22.0 篇 常见基于 UEFI 规范的 BIOS 实现方案 .................................................................... 131
第 23 篇 Secure Boot 简介 ................................................................................................................ 133
第 24 篇 Open source UEFI BIOS 开发实战简介 ...................................................................... 139
第 25 篇 How to rotate Screen .................................................................................................... 143
第 26 篇 Platform Environment Control Interface 简介 .................................................. 146

UEFI 内核导读
3
序
随着国家十四五新战略规划的推出,众多国内企业都参与到国产芯片替代浪潮中来,可以预测未来
越多的国产芯片会被设计、生产和使用在我们日常所使用的电子产品中,国产芯片拥有巨大的市场前景。
目前国产芯片采用的体系架构主要有 X86、ARM、MIPS、RISC V、PowerPC、Alpha 等。我们知道电子
产品正常工作必须要有操作系统和各种应用软件,没有操作系统和应用软件的芯片就是一堆废铁,而大多
数人并不知道的是没有系统固件来加载操作系统的电脑亦是一堆废铁, UEFI 就是由 UEFI 行业协会提出
和维护一种行业标准的系统固件,它支持目前市面上的大多数芯片体系结构和操作系统,随着标准的不断
演进相信越来越多的体系结构的芯片和操作系统会被支持。
笔者从事 BIOS 开发已有十余年的时间,见证了 Legacy BIOS 辉煌与隐退,也有幸了参与了新世纪初
系统固件从 Legacy BIOS 往 UEFI BIOS 的迁移的全过程。科技行业风起云涌新技术新架构日新月异,每每
回望不禁感慨我辈可谓是“眼见着他起高楼,眼见着他宴宾客”的那一波 BIOS 人。曾经系统固件江湖还
是 Legacy BIOS 的天下,BIOS 人使用汇编语言编码、通过中断来与操作系统沟通。自 UEFI 框架被广泛使
以来开我们的发环境从纯汇编变成了 99%的 C 语言加 1%的汇编语言的模式,开发效率大大的加强了。
虽然 UEFI 框架大大加快了开发效率,但是由于系统固件开发属于比较偏门和专业的领域,学习和入
门门槛比较高,现有的 BIOS 工程师又分布在大大小小的各个公司内部缺乏有效沟通和交流,同时 BIOS 源
码又属于敏感和机密数据受到各种 NDA 限制,市面上对 UEFI 框架介绍的资料少之又少,因此笔者从 2000
左右开始就陆续以 Cstyle_0x007 为 ID 在 https://blog.csdn.net/CStyle_0x007 发布一系列博文,现已
有数十篇原创文章。刚开始的想法是把博文当作工作笔记方便自己随时查阅,后来慢慢发展成了与业内外
感兴趣的朋友的沟通交流的平台。
随手写的博文难免有错误与纰漏为了避免误导大众,准备把博文重新整理在纠正谬误同时也会补充
一些新的内容,尽量做到所写的每句话都是无误的,也欢迎有兴趣的朋友踊跃提出意见和建议。组建了微
信公众号,目的在于方便有兴趣的朋友一起交流,名字初步定为“固件 C 字营”,其中“固件”泛指一切
固化的软件,这里主要指 UEFI BIOS 系统固件,“C”泛指“China“,我们可以把这里当作大家沟通交流
的营地,我们会不定时发布一些行业资讯、工作、学习心得,感兴趣扫描下面二维码就可以加入,也可以
发邮件到 CstyleFirmWareCamp@outlook.com 投稿分享你的想法。
本文取名《UEFI 内核的导读》这里的 UEFI 专指“UEFI BIOS”,全文专注于对 UEFI 内核的梳理与分
享,同时兼顾对 X86 系统固件生态中常用的工程技术的介绍,主要包含以下内容:UEFI 启动流程以及各
个阶段主要完成的任务及参考的实现方式导读 UEFI 及 PI 规范中的常见 Protocol 的实现与使用技巧 UEFI
固件生态中常见外设、总线、行业标准的协议内容及使用方法
雄关漫道真如铁,而今迈步从头越,系统固件雄起之路道阻且长,相信我们的 BIOS 人一定可以为国
产芯片的起飞助力、为系统固件团队的壮大贡献自己的一份微薄之力,为每一个不畏艰难、不惧寂寞坚守
在工作岗位的 BIOS 人加油,好样的。
固件 C 字营·武汉
11/21/2020

UEFI 内核导读
4
第 0 篇 SEC Reset Vector
不少介绍软件开发如何的书籍喜欢用“第一行代码学 xx”开始,我们也采用“第一条指令讲 UEFI”
的模式,但与之不同的是一般介绍软件的书籍都是从源码的角度来剖析第一行代码怎么执行的,第一个
“HelloWorld“是怎么输出的,这种方式虽容易入手但也有以下缺陷:
➢ 直接讲源码并不能理解在 CPU 视角下第一条指令是怎样被取指并执行的
➢ UEFI 源码构建的过程比较复杂,从源码角度很难理解 CPU 是如何查找并跳转到第一条指令
本文的目的在于以最底层 CPU 的视角介绍从处理器上电完成硬件初始化之后,如何开始它的第一条
指令的寻址并执行我们的代码的过程。因此我们采取一种“伪逆向“的方式,从最终构建生成的二进制文
件着手,试图从最底层视角去了解我们 CPU 是如何在硬件 reset 之后从我们的 BIOS ROM 里面寻找到第一
条指令、查找到 SEC Core 的位置并跳转到 SEC Core 代码的过程。从所谓 SEC 就是 CPU 刚完成硬件初始化
的时候执行的与 CPU 体系结构息息相关的代码,主要为后续 CPU 以及 Chipset 初始化代码所需的必备的环
境做准备。以下以 X86 架构为例介绍 UEFI BIOS 从 ResetVector->SEC->PEI->DXE->BDS->RT 的启动流程:
➢ RestVector 的初始化,以及异常向量的初始化
➢ CPU 工作模式的切换
➢ Enable Memory map PCI-E Config Space,RCBA,MCHBAR,GPIOBASE,PMBASE,HPEC,等
➢ MicroCode 的加载(或 FIT table)
➢ 侦测系统中的 CPU 的数量等 BIST
➢ 初始化 NEM(至此我们基本从渺无人烟的荒漠跳到了小绿洲了)
➢ 跳转到 PEICore 至此 SEC 阶段结束(继续在这片贫瘠的小绿洲上辛勤耕耘,亟待解救)
➢ PEICore 初始化内存(这次算是从绿洲迁移到土地肥沃富庶的中原地带了)
➢ 从 PEI 跳到 DXECore(在核心的中原腹地大展拳脚,攻城略地)
➢ 从 DXE 历经 BDS 引导操作系统,交由 OS 来掌控大权,保留 Runtime 在后台。(功成身退,为避兔死
狗烹,正式进行权利交接,BIOS 退出历史舞台,到后台享清福去)
ResetVector:
1.使用 RW 来读取 memory 的 0xfffffff0 位置就像下面截图 1 一样,不过在做这个之前,下确认下你的主
板的 BIOS 是否是 UEFI 的,本人的 NB 是 intel 的 HM86,看了下是 AMI Aptio 的 core 这里仅仅以 intel
的板子为例,AMD 的可自行研究,但是方法一样。上面的 90 90 就是 CPU 上电之后执行的第一条指令,可
以查 intel 的文档,这两个字节其实是表示两条指令,NOP NOP 意思是 CPU 什么也不做,等待两个指令周
期。然后下一条指令是 E9 C3F8 这里的意思是一条跳转指令,意思是 JMP 0xF8C3,这是一条段内相对跳
转指令,CPU 只改变 IP 地址,不改变段地址。跳转的目标地址是:0xfffffff5+0xF8C3 =?这地址是多
少,会算吗?这里有好几个陷阱需要我们注意:
➢ JMP 指令是基于当前的下一条地址往另外一个地址做段内跳转,所以是 0xfffffff5
➢ X86 是小端模式,所以目标的偏移地址是 0xF8C3,而不是 0xC3F8
➢ 0xF8C3 是一个负数,所以跳转地址是在 0xfffffff5 基础上往回跳,否则 IP 已经指向了
0xfffffff5,再跳就跳出了 4G 的了,所以最终的结果是:0xfffffff5+0xF8C3 =0xfffff8B8

UEFI 内核导读
5
图 1
下图 2 就是 CPU 完成了 ResetVector 跳转之后执行的第一条有意义的指令,我们通过查询 intel 的
手册:FINIT 指令(0xdb,0xe3)用来清除浮点数据寄存器栈和异常,初始化 FPU。为程序提供一个“干净”
的初始状态。否则,遗留在浮点寄存器栈中的数据可能会产生堆栈溢出,至此的第一条指令的讲解到此为
止,具体的命令可以查看 intel 的 IA32/X64 指令集文档,里面有详细的介绍。
图 2
2.刚刚说完了第一条指令,下面来说重点 SECCore。
那么说了半天 SECCore 到底在哪里呢,其实刚刚我们看到的第一条指令就是 SECCore 的入口,经过
刚刚的一番折腾其实我们已经进入到了 SECCore,那么现在我们来看看真正的 SECCore。这回还是使用
RW。从下面的这张图可以看到在 0xffffff60 的位置有如下的一系列数字,这个看似无序的数字其实是有
着特殊的意义的,相信高手一眼就能可能出端倪来。仔细看看能看到什么?没错这个从 offset 00~0F 其实
是一个很特殊的数字,我们把他称之为 top file GUID 当然它还有一个更为官方的名字叫做 Volume Top
File (VTF),从这里开始到我们刚刚的 ResetVector 结束这一段所有的内容就是我们的 SECCore,看起来
很诡异是吧,其实不然,这个都是有文档规定的,细节可以参考 intel 的大叔们写的那一堆的文档。
剩余150页未读,继续阅读
















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0