UEFI开发探索100 – 《UEFI编程实践》发布啦

请保留-> 【原文:  https://blog.csdn.net/luobing4365 和 http://yiiyee.cn/blog/author/luobing/】

经过四百多天的奋斗,新书终于上市了(京东官方书店 https://item.jd.com/13406126.html):

每天晚上9点,在安排好孩子睡觉后,就坐在书桌前敲打键盘;每个周末,都逼迫自己进入代码和Spec的海洋,一句句调试,一点点查询。

看到书稿成型的那一刻,感觉一切的付出都值得了!

封面以红色色调为主,占据视觉中心的芯片,周边的器件和数字0、1,表明这是本计算机底层实践的书。在各种器件间专心走着的漫画小人,让我想起每个专心调试的日日夜夜。我很喜欢这个封面的感觉,工程师的文化感扑面而来。

书中提供了33个UEFI应用和驱动示例,以及多个用来配合实验的Windows程序、Linux程序和嵌入式程序。涵盖了构建程序架构、调试方法、构建GUI、各种总线外设的访问、网络应用开发、UEFI驱动和Option ROM开发等内容,特别介绍了国产计算机下的UEFI开发,是偏实战操作的技术性书籍。

1 内容简介

《UEFI编程实践》总共12章,可分为四个部分,其内容编排如下。

第一部分 UEFI环境搭建及UEFI应用构建✨

第一部分介绍UEFI的基本知识,包括UEFI的发展、开发和调试环境的搭建,以及UEFI程序的构建。特别是调试部分,是后续开发中经常需要使用的。这部分包括第1章、第2章和第3章。

第1章 UEFI的世界

概览了Legacy BIOS和UEFI BIOS的组成部分,并分析比较了UEFI BIOS和Legacy BIOS的优缺点。介绍了UEFI BIOS的组成部分和启动过程,以及它在国产计算机发展中所起的作用;

第2章 UEFI开发和调试环境搭建

介绍了如何在Windows和Linux主机上,搭建UEFI的开发环境和调试环境。为方便测试和调试UEFI程序,本章还介绍了如何制作Legacy BIOS和UEFI BIOS下的UEFI启动盘。

第3章 构建UEFI应用

介绍了UEFI各种工程文件的规范,包括DSC文件、INF文件和DEC文件等。详细描述了构建UEFI应用和UEFI Package的方法,以及如何使用C++语言编写UEFI程序。

第二部分 图形图像、汉字显示和GUI构建✨

第二部分开始,进入实际的项目试验。此部分包括第4章、第5章和第6章。介绍了UEFI图形编程、汉字显示、图像显示,并在这些知识的基础上构建了UEFI的GUI(图形用户接口)。

第4章 图形与汉字显示

介绍UEFI图形显示的原理,实现了各种基本图形的显示。并基于这些函数,使用点阵显示的方式,在UEFI环境下显示汉字。另外还介绍了UEFI提供的HII(人机接口基础架构),以及使用HII实现汉字和字符串的显示。

第5章 图像显示及特效

介绍如何在UEFI环境下,显示BMP格式、PCX格式和JPEG格式的图像。以及如何使用HII方式,进行图像的显示。介绍并实现了各类图像特效,可直接应用于各类项目中。

第6章 GUI开发与移植

介绍了UEFI下GUI的基本组成和实现,构建了初级的UEFI GUI框架。并将开源GUI框架GuiLite,移植到了UEFI环境下。

第三部分 UEFI下访问各类总线设备✨

实际项目中,需要通过各种总线将软硬件有机地结合起来。第三部分介绍了如何在UEFI下通过各种总线访问硬件设备,以及使用相关的协议,包括PCI/PCIE、SMBus、串口、USB和网络,并介绍了UEFI驱动以及Option ROM的编写方法。本部分包括第7章、第8章、第9章和第10章共四章。

第7章 UEFI环境下访问外设

介绍如何使用UEFI提供的API访问各类外设,包括PCI/PCIE设备、SMBus设备和串口设备。

第8章 UEFI驱动与Option ROM

详细介绍了UEFI驱动,包括服务型驱动和UEFI驱动模型。以笔者自制的开发板YIE001为例,介绍了如何编写一种特殊的UEFI驱动-Option ROM,它在显卡、网卡等板卡设备上有比较广泛的作用。

第9章 UEFI与USB

介绍了USB规范,以及UEFI下对USB访问的支持。使用开发板YIE002,实现了自制的USB HID设备,并使用它演示如何在UEFI下访问USB HID设备。

第10章 UEFI与网络

介绍了如何在实际UEFI环境下,以及各种虚拟机中,搭建UEFI的网络测试环境。本章还介绍了UEFI对网络的支持,以及如何编写UEFI下的TCP4和TCP6的网络程序。

第四部分 国产计算机与UEFI✨

本部分介绍了国产计算机龙芯和飞腾的现状,以及如何使用X86的Windows/Linux主机,搭建跨平台的UEFI开发和编译环境。第11章和第12章属于第四部分。

第11章 龙芯平台上开发UEFI程序

介绍了龙芯的发展历史,以及其目前的产品线。以龙芯主打的桌面级产品3A4000为例,介绍了龙芯CPU架构和指令集,以及如何使用Linux Lab学习龙芯的指令集和汇编语言。另外还介绍了如何使用厂商提供的代码和工具,配合开源的EDK2代码,搭建龙芯平台的UEFI开发环境。

第12章 飞腾平台上开发UEFI程序

介绍了飞腾平台的系列产品,以桌面级产品FT2000/4为例,对飞腾CPU架构和指令集进行了概括性描述。并使用ARM提供的开源工具,配合EDK2代码,搭建了支持包括飞腾在内的ARM64的UEFI开发环境。为方便没有实际飞腾硬件平台的开发人员,还介绍了如何使用Qemu搭建飞腾平台的UEFI测试环境。

2 代码库

为方便读者阅读,我在Gitee和Github上建好了本书的代码仓库,地址如下:

⚡️ Github代码仓库 https://github.com/luobing/uefi-practical-programming

⚡️ Gitee代码仓库 https://gitee.com/luobing4365/uefi-practical-programming

代码库中的文件可以分为几类:

  1. 示例工程。为阐述某个议题而编写的代码,包括UEFI应用和UEFI驱动,主要包含在RobinPkg
    文件夹下;
  2. 框架工程。包括开发用的几种UEFI应用框架,调试时用的框架工程,分散在每章的文件夹中;
  3. 辅助工具。每章的实验中,需要用到的测试代码和工具。比如第4章的汉字提取工具、第9章的USB HID设备代码等。

书中的UEFI代码,基本上是在Win10下,使用UDK2018+Visual Studio 2015进行编译开发的。辅助工具中的代码,则包含了嵌入式工程、Windows的MFC工程和Linux下的工程。主要使用了以下几种开发工具:

  • 嵌入式工程:MDK-ARM 5.14.0.0
  • Windows MFC工程: Visual Studio 2015
  • Windows Application工程:Visual Studio 2015
  • Linux工程(主要是网络程序):GCC 7.5.0

更多的信息,请参考Gitee代码库或Github代码库中的说明,以及书中的介绍。

3 实验用开发板

《UEFI编程实践》的实验,基本都可以使用EDK2模拟器,或者在实际硬件环境的UEFI Shell中进行。有些实验,可以使用虚拟机来进行。不过,有两个实验,是必须要实际的硬件设备支持的。

第8章介绍的UEFI驱动和PCI Option ROM开发,以及第9章介绍的UEFI下的USB开发,必须用到PCIE板卡和支持USB开发的嵌入式开发板。

为此,我特别做了两个开发板,也即博客中介绍过的YIE001和YIE002。如下图所示:

YIE001开发板是为开发UEFI Option ROM而制作的,其目的为了演示Option ROM代码如何调用Protocol、如何控制硬件。它是一块PCIe的板卡,提供了拨动开关控制、LED灯的控制以及I2C的接口。

YIE002开发板则是一块U盘大小的开发板,主要目的是为了进行USB HID设备的开发。实际上在此开发板上,提供了LED等、按键、TTL串口、RS232串口和RS485串口的功能,是一个便于携带的小型开发板。

书中使用它们,是为了便于讲解。笔者目前没有计划去打样生产,想到硬件生产那一堆的工作,头有点大。

读者完全可以使用自己手中的开发板,去进行第8章和第9章的实验。YIE001作为PCIE开发板,可能不容易找到,开发板卡(比如网卡、显卡)的读者应该会有这方面的资源,书中的代码稍作修改就可运行。

YIE002作为实现USB HID设备的开发板,有很多可以替代的。比如正点原子的F1战舰和F4探索者开发板,都可以使用。笔者手上有款F4探索者,最早的USB HID嵌入式工程,就是在它上面实现的。代码库的chap09文件夹下,把这个项目工程STM32F4_UEFI放进去了,供读者参考。

针对YIE001开发板和YIE002开发板,笔者做了十几个有趣的实验,有兴趣的读者也可以看看。

  • 📚 YIE001PCIe开发板探索:

📙 UEFI开发探索65- YIE001PCIe开发板(01开篇)
📙 UEFI开发探索66- YIE001PCIe开发板(02 UEFI驱动)
📙 UEFI开发探索67- YIE001PCIe开发板(03 UEFI驱动)
📙 UEFI开发探索68- YIE001PCIe开发板(04 UEFI驱动)
📙 UEFI开发探索69- YIE001PCIe开发板(05 UEFI驱动)
📙 UEFI开发探索70- YIE001PCIe开发板(06 UEFI驱动))
📙 UEFI开发探索71- YIE001PCIe开发板(07 OptionROM框架)
📙 UEFI开发探索75- YIE001PCIe开发板(08 跑马灯实验)
📙 UEFI开发探索76- YIE001PCIe开发板(09 界面和键盘控制)
📙 UEFI开发探索77- YIE001PCIe开发板(10 拨动开关及显示)
📙 UEFI开发探索78- YIE001PCIe开发板(11 贪吃蛇)
📙 UEFI开发探索79- YIE001PCIe开发板(12 贪吃蛇)
📙 UEFI开发探索80- YIE001PCIe开发板(终篇 移植杂谈)

  • 📚 YIE002USB开发板探索:

📘 UEFI开发探索72- YIE002USB开发板(01 开篇)
📘 UEFI开发探索73- YIE002USB开发板(02 Windows编程)
📘 UEFI开发探索74- YIE002USB开发板(03 Windows编程)
📘 UEFI开发探索81- YIE002USB开发板(04 制作HID设备)
📘 UEFI开发探索82- YIE002USB开发板(05 制作HID设备)
📘 UEFI开发探索83- YIE002USB开发板(06 制作HID设备)
📘 UEFI开发探索84- YIE002USB开发板(07 制作HID设备)
📘 UEFI开发探索85- YIE002USB开发板(08 制作HID设备)
📘 UEFI开发探索86- YIE002USB开发板(09 UEFI对USB的支持1)
📘 UEFI开发探索87- YIE002USB开发板(10 UEFI对USB的支持2)
📘 UEFI开发探索88- YIE002USB开发板(11 UEFI下访问HID设备)
📘 UEFI开发探索89- YIE002USB开发板(12 Linux编程)
📘 UEFI开发探索90- YIE002USB开发板(13 Linux编程)
📘 UEFI开发探索93–UEFI下使用YIE002随机数发生器

另外,针对YIE002开发板,笔者尝试使用STM32 Cube MX开发了一系列示例,请见:

❤️ CSDN博客 YIE002开发探索
💜 知乎专栏 YIE002开发探索-Cube MX编程

与之相关的代码仓库:
⚡️ YIE002开发探索 https://gitee.com/luobing4365/yie002-explorer

4 其他

在编写本书的过程中,笔者尽量做到每句话都言之有据。但是学识有限,书中可能出现错误和不准确的介绍,恳请读者批评指正。如果发现本书的任何错误,或者有任何的建议,请发邮件至:

✉️ email to: uefi_explorer@163.com

对于本书的勘误,笔者会在代码仓库的文件-勘误.md中给出,浏览地址:

《UEFI编程实践》勘误

请打开书本,开始享受UEFI编程的乐趣吧!

595 total views, 8 views today

发表评论

电子邮件地址不会被公开。