首页>参考读物>计算机科学与技术>软件与程序设计

UEFI编程实践
作者 : 罗冰 著
出版日期 : 2021-08-18
ISBN : 978-7-111-68885-3
定价 : 119.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 391
开本 : 16
原书名 :
原出版社:
属性分类: 店面
包含CD : 无CD
绝版 : 未绝版
图书简介

本书偏重于实战,面向UEFI的爱好者和使用者。全书共12章,大致可以分为三部分。
1. 第1部分为介绍UEFI的基础框架,搭建开发和调试环境,并熟悉代码框架的搭建和编译方法。让读者能把握整体框架,并能为后续的实践做好准备;
2. 第2部分详细讲解UEFI如何访问外设、构建GUI、编写Option ROM等,并辅以实际的项目实例,加深对UEFI编程的理解。所提供的项目极具实践价值,基本上可以直接用在实际项目中;
3. 第3部分介绍目前国产计算机上UEFI的发展情况,详细讲解如何在国产计算机上进行UEFI项目的开发,包括搭建开发环境、测试方法等。
通过阅读本书,读者可以清晰地了解UEFI的编程方法,学习到如何以UEFI的方式去思考计算机的底层架构。书中提供了大量的实例训练,大部分来自作者曾经实战过的商业项目,极具参考价值,能有效帮助读者快速构建自己的UEFI相关产品。

图书特色

软件专家张银奎、UEFI专家戴正华联袂推荐,领域专家撰写,30多个精巧实例,可操作性强
内容系统全面,涵盖了UEFI应用和驱动开发、调试,其中提供了USB、网络、PCI/PCIE等总线访问方法,以及不可缺的图形图像开发方法

图书前言

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_explorer@163.com。
本书介绍的内容完全是笔者本人观点,不代表任何公司和单位。读者可以自由使用本书介绍的示例代码和工具,但笔者不对因使用本书内容和附带资料而导致的任何直接或间接结果承担任何责任。
致谢
感谢好友张佩,在他的鼓励和帮助下,才有了笔者系列博客“UEFI开发探索”的诞生,以及之后本书的出版。
感谢机械工业出版社的高婧雅和孙海亮,他们耐心地指点笔者行文并细致地审阅、修订了书稿。
感谢张银奎老师十年前对笔者安全计算机项目的指点,从那时开始,笔者开启了UEFI探索的旅程。
感谢《UEFI原理与编程》一书的作者戴正华老师,他允许笔者使用他书中的代码构建程序,读者在示例工程CppMain中能看到这部分内容。
感谢GuiLite的作者idea4good,他很支持笔者将GuiLite移植到UEFI环境下,并在移植过程中非常耐心地解答笔者遇到的各种问题。
感谢龙芯中科的李超和李强,他们解决了笔者在编写和调试龙芯平台UEFI代码中遇到的不少奇怪问题,并始终关心着本书的出版进度。
感谢我的家人,亲爱的妻子和可爱的女儿。在写作本书的漫长日子里,她们始终支持着我,这本书是送给她们的礼物。
最后,感谢阅读本书的你,希望本书能帮助你进入UEFI的世界。

上架指导

计算机\程序设计

封底文字

UEFI BIOS自推出以来,得益于其良好的可编程性、可维护性和安全性,逐渐成为主流的BIOS架构。近几年来,国产计算机蓬勃发展,龙芯、飞腾、鲲鹏等各类处理器厂商都采用了UEFI BIOS作为其产品的底层支撑系统。
同时,除去BIOS开发厂商,第三方开发者采用UEFI BIOS的也越来越多,包括各类网卡厂商、显卡厂商、还原卡厂商等。编写支持UEFI BIOS的软件,是各厂商急需解决的问题。
本书对UEFI应用和驱动的开发,特别是Option ROM的开发做了细致而深入的讲解。本书主要有3个特色。
内容全面:对于各类总线外设,包括USB、网络、PCI/PCIE、串口和SMBus都提供了实际操作案例。
偏重实操:着重介绍了图形开发、对各种格式图像的访问,以及UEFI下GUI系统的构建,这些内容对实际项目开发有非常重要的意义。
结合市场:介绍了龙芯和飞腾处理器的发展情况,以及在各种国产平台下进行UEFI软件开发的方法。

图书目录

序一
序二
前言
第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

教学资源推荐
作者: (美)Bjarne Stroustrup 著
作者: 陈家骏 郑滔 编著
作者: [美] 罗伯特·塞奇威克(Robert Sedgewick) 凯文·韦恩(Kevin Wayne) 罗伯特·唐德罗(Robert Dondero) 著
参考读物推荐
作者: 刘文志 著
作者: (美)Steve Teixeira
作者: 王院峰