查看原文
其他

【新书速递】UEFI开发探索

罗冰 华章计算机 2022-10-26


作为信息时代的一员,很多人每天坐在办公桌前,开始一天工作时,都会按下计算机的开机键。每个人的计算机都会从形形色色的启动界面开始,进入到Windows、Mac OS或者Linux系统。相比于这些鼎鼎大名的操作系统,隐藏在启动界面之后的世界却鲜为人知。


这是一个被称为BIOS(Basic Input and Output System,基本输入输出系统)的世界,它是连接每台计算设备和操作系统的纽带。可以这么说,没有它的工作,这些计算设备和砖头没有什么区别—只是更贵些罢了。


与计算机领域的其他软件一样,BIOS也经历了长期的发展。在个人计算机出现的近40年间,各个厂商互相博弈,在市场上拼杀,有些BIOS技术留下来了,而更多的消失在残酷的竞争之中。在这个过程中,大致可以将其分为两个时期:Legacy BIOS时期和UEFI BIOS时期。


Legacy BIOS存在近40年,由于其本身的局限性,一直无法跟上硬件的发展,并且在可编程性、可维护性、安全性方面表现很差。UEFI推出之后,上述的问题都被很好地解决了,并且因为其对64位良好的适应性(UEFI最初就是针对64位安腾平台设计的),迅速取代了Legacy BIOS。


得益于UEFI良好的设计,在目前国产计算机中,普遍采用它作为BIOS的架构。如今,UEFI已经成为事实上的BIOS标准,所有想深入理解计算机系统,有志于底层开发的工程师都有必要深入了解UEFI架构及其编程方法。


作为主流的BIOS架构,可供参考的书籍实在太少。《UEFI编程实践》一书则填补了这方面知识的空缺。



《UEFI编程实践》

书中提供了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代码库中的说明,以及《UEFI编程实践》一书中的介绍。

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开发板,作者做了十几个有趣的实验,有兴趣的读者也可以查看:https://zhuanlan.zhihu.com/p/405897922 。




扫码关注【华章计算机】视频号

每天来听华章哥讲书




更多精彩回顾



书讯 | 9月书讯 | 秋天的第一本书,来了资讯 | 什么是Serverless?有哪些应用?终于有人讲明白了书单 | 10本书,帮你看清未来的科技趋势干货 | Linux30岁生日:Linux 成功的真正原因收藏 | 终于有人把Scrapy爬虫框架讲明白了上新 | 【新书速递】“帆船书”——数据库领域殿堂级作品,全新升级第7版!赠书 | 【第71期】破案了!库里为何会花18万美元买一个猴子头像?点击阅读全文优惠购买

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存