【前 言】
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章后,再去选择相应的章节进行学习。