本书系统地介绍了X86、龙芯、飞腾架构下的UEFI应用和驱动开发,系统调试专家、《软件调试》作者张银奎,以及UEFI专家、《UEFI原理与编程》作者戴正华联袂推荐。
本书以项目开发为导向,采取近实战,多实例的方式,细致深入地介绍了UEFI应用和驱动开发相关的知识。
第1~3章,介绍了UEFI系统的组成、启动过程,在各种操作系统中搭建和调试开发环境的方法,以及UEFI应用和驱动开发的基本方法。
第4~10章以实际的开发实践为索引,介绍了图形图像开发、汉字显示、GUI构建、访问PCI/PCIE设备、访问SMBus设备、访问串口设备、实现USB通信和网络通信等内容。这部分以贴近实际开发的方式来构建实例,并深入剖析相关硬件协议及其在UEFI上的实现。
第11章和第12章,讲解了龙芯和飞腾架构,以及如何在这两类国产处理器上进行UEFI软件开发。
(1)事实BOIS标准UEFI唯二中文图书
(2)30多个设计精巧实例,可操作性强
(3)资深专家撰写,十余年经验总结
(4)软件专家张银奎、UEFI专家戴正华联袂推荐
(5 )全书代码可免费获取
本书对UEFI应用和驱动的开发,特别是Option ROM的开发做了细致而深入的讲解。本书主要有3个特色:
●内容全面:
对于各类总线外设,包括USB、网络、PCI/PCIE、串口和SMBus都提供了实际操作案例。
●偏重实操:
着重介绍了图形开发、对各种格式图像的访问,以及UEFI下GUI系统的构建,这些内容对实际项目开发有非常重要的意义。
●结合市场:
介绍了龙芯和飞腾处理器的发展情况,以及在各种国产平台下进行UEFI软件开发的方法。
【前 言】
2011年9月,笔者次接触UEFI的项目。
当时,我们正与国内某PC大厂合作,开发一款安全计算机。这款产品包含一个嵌入BIOS中的软件模块,此模块是用汇编语言编写的Option ROM。由于合作方计划将BIOS架构全部转为UEFI,因此要求我们将软件模块移植到UEFI架构下。
在对UEFI的理解还非常初级的情况下,笔者忐忑地接下了任务。用了三周时间,在AMI的集成工具上,笔者使用C语言将原有的软件模块重写为了UEFI驱动,总算是圆满完成了任务。
这之后,笔者花了不少时间去研究UEFI的公开文档,尝试着做了很多实验。在此期间,UEFI规范从2.3升级到2.8;身边的计算机运行Legacy BIOS的越来越少,运行UEFI BIOS的越来越多。UEFI的开发效率高、可扩展性好,而且系统性能和安全性都很高,支持X86、ARM和RISC-V等多种指令集架构。时至今日,UEFI已经成为事实上的BIOS标准,所有有志于底层开发的工程师都有必要深入了解UEFI架构及其编程方法。
【本书的写作初衷】
因十年前的项目机缘,笔者开始学习UEFI的相关知识,并利用业余时间,以UEFI开发探索为名,撰写了UEFI开发的系列博客。在此期间,认识了不少业界的朋友,在产品开发、市场推广方面,我们有过相当多的探讨。
也是因为如此,当国产自主计算机从前几年开始大批量出货,而大部分BIOS采用了UEFI架构时,笔者一点都不感到奇怪。基于此认识,公司的产品针对国产自主计算机的软件架构进行了较大改造,如果没有UEFI架构的支持,这是做不到的。
在产品开发的过程中,能够参考的资料,除去UEFI规范等公开资料外,英文资料有Intel Press出版的Beyond BIOS和Harnessing the UEFI Shell。中文资料,则只有戴正华老师的《UEFI原理与编程》。作为主流的BIOS架构,可供参考的书籍实在太少。
笔者长期进行Legacy BIOS和UEFI BIOS的ROM开发,对于底层编程有丰富的项目经验。因此,萌生了将日常的实践经验记录下来并集结成册的想法。希望能为UEFI的推广,特别是国产化计算机的发展,贡献自己的一份力量。
【本书特点及读者对象】
本书以实践为主,主要特点如下。
●是为数不多的介绍国产计算机UEFI开发的书籍。
●针对每个主题,都准备了相应的示例和代码,目的是以实例讲解知识点。
●偏重于解决实际项目中遇到的问题,包括汉字显示、构建GUI界面、访问PCIE设备和USB设备等。
书中详细地介绍了如何在Windows/Linux主机上搭建UEFI开发和调试环境,以及构建和编译UEFI程序,非常适合UEFI开发初学者阅读,可以帮助他们循序渐进地进入UEFI世界。
本书也很适合UEFI的专业开发者,包括云终端、显卡、还原卡等领域的开发者使用。书中提供的丰富的源代码能为项目开发提供很好的参考。
【本书如何阅读】
开发UEFI程序,要求程序员有C/C 语言的背景。如果了解对应架构(比如X86、ARM、RISC -V等)的汇编语言和Python语言,对于调试和理解编译过程会更有帮助,当然这不是必需的。
本书的代码仓库为https://gitee.com/luobing4365/uefi-practical-programming.git或者https://github.com/luobing/uefi-practical-programming.git。读者可以使用GIT工具,将代码下载到本地阅读。
按照本书介绍的示例进行操作,需要用到各种参考手册,特别是UEFI规范参考手册(目前版本为V2.8)、库函数参考手册等。这些文档可以在www.uefi.org和GitHub的仓库tianocore/tianocore.github.io中找到。
另外,在调试UEFI程序的过程中,会用到各种调试工具,包括WINDBG或DBG等,读者可以根据自己的知识背景选择熟悉的工具。本书没有详细介绍调试工具的用法,建议读者参考张银奎老师的《软件调试》,这也是笔者常备的参考书籍。
【本书共分12章,具体内容如下】
第1章 概览了Legacy BIOS和UEFI BIOS的组成部分,并分析、比较了Legacy BIOS和UEFI BIOS的优缺点,介绍了UEFI BIOS的组成部分和启动过程,以及它在国产计算机发展中所起的作用。
第2章 介绍了如何在Windows和Linux主机上搭建UEFI的开发环境和调试环境。为方便测试和调试UEFI程序,还介绍了如何制作Legacy BIOS和UEFI BIOS下的UEFI启动盘。
第3章 介绍了UEFI中各种工程文件的规范,包括DSC文件、INF文件和DEC文件等。详细描述了构建UEFI应用和UEFI包的方法,以及如何使用C 语言编写UEFI程序。
第4章 介绍了UEFI图形显示的原理,实现了各种基本图形的显示,并基于图形函数,使用点阵显示的方式,在UEFI环境下显示汉字。另外介绍了UEFI提供的HII(人机接口基础架构),以及使用HII实现汉字和字符串显示的方法。
第5章 介绍了如何在UEFI环境下显示BMP格式、PCX格式和JPEG格式的图像,以及如何使用HII方式进行图像的显示。还介绍并实现了各类图像特效,其相关方法可直接应用于各类项目中。
第6章 介绍了UEFI下GUI的基本组成和实现,构建了初级的UEFI GUI框架,并将开源GUI框架GuiLite移植到了UEFI环境下。
第7章 介绍了如何使用UEFI提供的API访问各类外设,包括PCI/PCIE设备、SMBus设备和串口设备。
第8章 详细介绍了UEFI驱动,包括服务型驱动和UEFI驱动模型。以笔者自制的开发板YIE001为例,介绍了如何编写一种特殊的UEFI驱动Option ROM,它在显卡、网卡等板卡设备上应用比较广泛。
第9章 介绍了USB规范,以及UEFI下对USB访问的支持。使用开发板YIE002,实现了自制的USB HID设备,并使用它演示如何在UEFI下访问USB HID设备。
第10章 介绍了如何在实际的UEFI环境下,以及各种虚拟机中,搭建UEFI的网络测试环境。还介绍了UEFI对网络的支持,以及如何编写UEFI下的TCP4和TCP6的网络程序。
第11章 介绍了龙芯的发展历史,以及目前的产品线。以龙芯主打的桌面级产品3A4000为例,介绍了龙芯CPU架构和指令集,以及如何使用Linux Lab学习龙芯的指令集和汇编语言。另外介绍了如何使用厂商提供的代码和工具,配合开源的EDK2代码,搭建龙芯平台的UEFI开发环境。
第12章 介绍了飞腾平台的系列产品,以桌面级产品FT-2000/4为例,对飞腾CPU架构和指令集进行了概括性描述,并使用ARM提供的开源工具,配合EDK2代码,搭建了支持包括飞腾在内的ARM64的UEFI开发环境。为方便没有实际飞腾硬件平台的开发人员使用和实验,还介绍了如何使用QEMU搭建飞腾平台的UEFI测试环境。
对读者而言,如果是为X86平台开发UEFI项目,建议先熟悉第1~3章的内容,然后根据自己的需要选择相应的章节进行阅读;如果是为国产计算机平台开发项目,则建议熟悉了第1~3章和第11~12章后,再去选择相应的章节进行学习。
罗 冰
物理隔离安全领域专家,主导开发过网络隔离卡、双网隔离机、国产隔离系统、单向光传输系统等各类安全产品,拥有十几项发明和实用新型专利。致力于UEFI技术的研究、实践,以及相关产品的开发,在CSDN和知乎上设有UEFI开发探索专栏。译著有《现代X86汇编语言程序设计》《21世纪机器人》,目前就职于国内某网络安全公司,担任总工程师。
●第1章 UEFI的世界 1
1.1 Legacy BIOS1
1.1.1 Legacy BIOS的启动过程2
1.1.2 Legacy BIOS的不足之处4
1.2 UEFI BIOS6
1.2.1 UEFI标准概述6
1.2.2 UEFI BIOS的优点8
1.2.3 UEFI BIOS的启动过程9
1.2.4 国产计算机与UEFI13
1.3 本章小结15
●第2章 UEFI开发和调试环境搭建16
2.1 搭建Windows下的UEFI开发环境17
2.1.1 安装开发工具17
2.1.2 配置开发环境18
2.1.3 编译UEFI模拟器和UEFI程序20
2.1.4 使用模拟器运行UEFI程序22
2.2 Windows下调试UEFI程序24
2.2.1 使用Visual Studio调试UEFI程序24
2.2.2 使用WINDBG调试UEFI程序27
2.3 搭建Linux下的UEFI开发环境30
2.3.1 安装开发工具31
2.3.2 配置开发环境32
2.3.3 编译UEFI模拟器和UEFI程序32
2.3.4 使用模拟器运行UEFI程序33
2.4 Linux下调试UEFI程序34
2.4.1 使用GDB调试UEFI程序34
2.4.2 使用Intel UDK Debugger Tool和GDB调试UEFI程序37
2.5 制作UEFI启动盘40
2.6 本章小结41
●第3章 构建UEFI应用42
3.1 模块和包概述42
3.2 搭建UEFI工程模块44
3.2.1 DSC文件44
3.2.2 INF文件50
3.2.3 3种入口函数的UEFI应用55
3.2.4 库模块的编写61
3.2.5 其他工程文件63
3.3 搭建UEFI包72
3.3.1 包的DSC和DEC文件72
3.3.2 添加并编译模块73
3.4 用C 编写UEFI应用74
3.4.1 支持基础功能75
3.4.2 支持全局类77
3.5 使用UEFI Protocol81
3.5.1 Protocol概述81
3.5.2 支持使用Protocol的函数 83
3.5.3 使用Protocol示例91
3.6 本章小结93
●第4章 图形与汉字显示94
4.1 UEFI图形显示95
4.1.1 图形显示的Protocol 95
4.1.2 图形显示基本函数的实现101
4.2 UEFI汉字显示写像素点的方式107
4.2.1 点阵字的显示与字库提取108
4.2.2 写像素点的汉字显示110
4.3 UEFI汉字显示HII方式115
4.3.1 HII字体与字库提取116
4.3.2 HII汉字显示119
4.3.3 HII字符串127
4.4 本章小结132
●第5章 图像显示及特效133
5.1 UEFI图像显示写屏方式134
5.1.1 BMP图像显示 134
5.1.2 PCX图像显示140
5.1.3 JPEG图像显示145
5.2 UEFI图像显示HII方式150
5.2.1 图像处理Protocol150
5.2.2 HII图像显示153
5.3 图像显示的特效 157
5.3.1 图像块处理基本函数的实现157
5.3.2 颜色变换特效161
5.3.3 镜像显示165
5.3.4 图像块显示与清屏166
5.4 本章小结170
●第6章 GUI开发与移植172
6.1 支持GUI的基础服务 172
6.1.1 UEFI事件处理 173
6.1.2 UEFI键盘处理179
6.1.3 UEFI鼠标处理 185
6.1.4 构建GUI框架186
6.2 开源GUI框架191
6.2.1 GuiLite介绍191
6.2.2 使用GuiLite编程 195
6.3 GUI框架的移植200
6.4 本章小结203
●第7章 UEFI环境下访问外设205
7.1 访问PCI/PCIE设备205
7.1.1 与PCI/PCIE设备通信的机制206
7.1.2 支持访问PCI/PCIE设备的Protocol209
7.1.3 访问PCI/PCIE设备示例213
7.2 访问SMBus设备216
7.2.1 SMBus协议简介216
7.2.2 支持访问SMBus设备的Protocol218
7.2.3 访问SMBus设备示例220
7.3 访问串口设备223
7.3.1 串口协议简介223
7.3.2 支持访问串口设备的Protocol225
7.3.3 访问串口设备示例228
7.4 本章小结230
●第8章 UEFI驱动与Option ROM232
8.1 服务型驱动233
8.1.1 安装与卸载Protocol233
8.1.2 构建服务型驱动236
8.1.3 访问示例Protocol242
8.2 UEFI驱动模型243
8.2.1 EFI Driver Binding Protocol 243
8.2.2 EFI Component Name Protocol247
8.2.3 完成驱动框架及其测试248
8.2.4 构建UEFI驱动及其测试程序251
8.2.5 测试UEFI驱动256
8.3 编写Option ROM258
8.3.1 PCI Option ROM简介258
8.3.2 编写UEFI Option ROM264
8.3.3 编译及测试Option ROM268
8.4 本章小结272
●第9章 UEFI与USB273
9.1 USB规范简介274
9.1.1 USB通信原理276
9.1.2 USB描述符280
9.1.3 USB标准命令285
9.1.4 USB HID设备287
9.2 支持USB访问的Protocol292
9.2.1 EFI_USB2_HC_PROTOCOL292
9.2.2 EFI_USB_IO_PROTOCOL294
9.2.3 列举USB控制器和设备297
9.3 访问USB HID设备299
9.3.1 制作USB HID设备299
9.3.2 在UEFI下访问USB HID设备305
9.4 本章小结307
●第10章 UEFI与网络309
10.1 准备UEFI网络测试环境311
10.1.1 搭建Nt32模拟器的网络环境311
10.1.2 在真实UEFI环境下使用网络313
10.1.3 在虚拟机UEFI环境下使用网络:VirtualBox314
10.1.4 在虚拟机UEFI环境下使用网络:QEMU314
10.1.5 IPv6网络测试环境搭建316
10.2 使用UEFI Protocol开发网络程序317
10.2.1 开发Windows的TCP4服务端程序318
10.2.2 开发UEFI的TCP4客户端程序323
10.3 使用StdLib的Socket接口开发网络程序334
10.3.1 使用Socket编写UEFI TCP4客户端程序334
10.3.2 开发Windows的TCP6服务端程序337
10.3.3 使用Socket编写UEFI TCP6客户端程序340
10.4 本章小结342
●第11章 龙芯平台上开发UEFI程序343
11.1 龙芯平台概述343
11.1.1 龙芯产品介绍344
11.1.2 3A4000的CPU架构简介346
11.2 龙芯汇编语言348
11.2.1 安装Linux Lab349
11.2.2 龙芯汇编语言实验351
11.3 龙芯平台UEFI开发环境354
11.3.1 搭建龙芯平台UEFI开发环境355
11.3.2 编译示例工程356
11.4 本章小结357
●第12章 飞腾平台上开发UEFI程序358
12.1 飞腾平台概述359
12.1.1 飞腾产品介绍359
12.1.2 FT-2000/4的CPU架构简介361
12.2 搭建飞腾平台UEFI开发环境363
12.2.1 准备EDK2环境364
12.2.2 使用Linux系统与gcc-arm365
12.2.3 使用Linux系统与Linaro UEFI工具367
12.3 飞腾平台的UEFI程序测试368
12.3.1 Windows系统下的UEFI测试环境369
12.3.2 Linux系统下的UEFI测试环境372
12.3.3 测试示例工程372
12.4 本章小结374
附录 UEFI Shell内置命令375