内容简介
这是国内首部UEFI专著,由资深UEFI专家兼布道者撰写,英特尔中国研究院院长吴甘沙强烈推荐!
本书以实战为导向,面向UEFI的使用者和开发者,首先细致地介绍了UEFI的系统组成、启动过程、优点,以及在各种系统中开发环境的搭建;然后深入剖析了UEFI的工作原理,包括UEFI工程模块、各种协议、基础服务、事件、硬盘和文件系统等内容;最后讲解了UEFI的开发,涉及UEFI服务的开发、UEFI驱动的开发、多任务应用的开发、网络应用的开发、GUI应用的开发,以及如何用C++和C标准库开发UEFI应用,等等。
封面图
目录
- 序
- 前言
- 第1章UEFI概述1
- 1.1BIOS的前世今生1
- 1.1.1BIOS在计算机系统中的作用1
- 1.1.2BIOS缺点2
- 1.2初识UEFI2
- 1.2.1UEFI系统组成3
- 1.2.2UEFI的优点4
- 1.2.3UEFI系统的启动过程5
- 1.3本章小结12
- 第2章UEFI 开发环境搭建14
- 2.1配置Windows开发环境14
- 2.1.1安装所需开发工具15
- 2.1.2配置EDK2开发环境15
- 2.1.3编译UEFI模拟器和UEFI工程17
- 2.1.4运行模拟器19
- 2.2配置Linux 开发环境21
- 2.2.1安装所需开发工具22
- 2.2.2配置EDK2开发环境22
- 2.2.3编译UEFI模拟器和UEFI工程23
- 2.2.4运行模拟器24
- 2.3OVMF的制作和使用25
- 2.4UEFI的启动27
- 2.5本章小结28
- 第3章UEFI工程模块文件29
- 3.1标准应用程序工程模块30
- 3.1.1入口函数30
- 3.1.2工程文件31
- 3.1.3编译和运行37
- 3.1.4标准应用程序的加载过程37
- 3.2其他类型工程模块43
- 3.2.1Shell应用程序工程模块43
- 3.2.2使用main函数的应用程序工程模块46
- 3.2.3库模块47
- 3.2.4UEFI驱动模块49
- 3.2.5模块工程文件小结50
- 3.3包及.dsc、.dec、.fdf文件51
- 3.3.1.dsc文件51
- 3.3.2.dec文件56
- 3.4调试UEFI59
- 3.5本章小结61
- 第4章UEFI中的Protocol62
- 4.1Protocol 在UEFI内核中的表示64
- 4.2如何使用Protocol服务65
- 4.2.1OpenProtocol服务66
- 4.2.2HandleProtocol服务67
- 4.2.3LocateProtocol服务69
- 4.2.4LocateHandleBuffer服务69
- 4.2.5其他一些使用Protocol的服务71
- 4.2.6CloseProtocol服务72
- 4.3Protocol服务示例73
- 4.4本章小结75
- 第5章UEFI的基础服务76
- 5.1系统表76
- 5.1.1系统表的构成77
- 5.1.2使用系统表79
- 5.2启动服务82
- 5.2.1启动服务的构成82
- 5.2.2启动服务的生存期91
- 5.3运行时服务93
- 5.4本章小结102
- 第6章事件103
- 6.1事件函数104
- 6.1.1等待事件的服务WaitForEvent105
- 6.1.2生成事件的服务CreateEvent106
- 6.1.3CreateEventEx服务110
- 6.1.4事件相关的其他函数112
- 6.2定时器事件113
- 6.3任务优先级114
- 6.3.1提升和恢复任务优先级115
- 6.3.2UEFI中的时钟中断116
- 6.3.3UEFI事件Notif ication函数的派发126
- 6.4鼠标和键盘事件示例127
- 6.5本章小结128
- 第7章硬盘和文件系统129
- 7.1GPT硬盘129
- 7.1.1基于MBR分区的传统硬盘129
- 7.1.2GPT硬盘详解130
- 7.2设备路径134
- 7.3硬盘相关的Protocol139
- 7.3.1BlockIo解析140
- 7.3.2BlockIo2解析142
- 7.3.3DiskIo解析146
- 7.3.4DiskIo2解析147
- 7.3.5PassThrough解析150
- 7.4文件系统152
- 7.5文件操作153
- 7.5.1打开文件154
- 7.5.2读文件156
- 7.5.3写文件159
- 7.5.4关闭文件(句柄)160
- 7.5.5其他文件操作160
- 7.5.6异步文件操作162
- 7.5.7EFI_SHELL_PROTOCOL中的文件操作166
- 7.6本章小结170
- 第8章开发UEFI服务171
- 8.1Protocol服务接口设计172
- 8.2Protocol服务的实现174
- 8.3服务型驱动的框架178
- 8.4ffmpeg的移植与编译179
- 8.4.1libavcodec的建立和移植181
- 8.4.2其他库的建立与移植182
- 8.4.3在驱动型服务中使用StdLib186
- 8.5使用Protocol服务188
- 8.6本章小结190
- 第9章开发UEFI驱动191
- 9.1UEFI驱动模型192
- 9.1.1EFI Driver Binding Protocol的构成192
- 9.1.2EFI Component Name Protocol的作用和构成 196
- 9.2编写设备驱动的步骤197
- 9.3PCI设备驱动基础199
- 9.4AC97控制器芯片的控制接口202
- 9.5AC97驱动206
- 9.5.1AC97驱动的驱动服务EFI_AUDIO_PROTOCOL206
- 9.5.2AC97驱动的框架部分213
- 9.5.3AC97驱动实验220
- 9.6本章小结221
- 第10章用C++开发UEFI应用222
- 10.1从编译器角度看C与C++的差异222
- 10.2在EDK2中支持C++224
- 10.2.1使EDK2支持C++基本特性224
- 10.2.2在Windows系统下的程序启动过程226
- 10.2.3在Windows系统下支持全局构造和析构229
- 10.2.4在Linux系统下的程序启动过程231
- 10.2.5在Linux系统下支持全局构造和析构240
- 10.2.6支持new和delete242
- 10.2.7支持STL243
- 10.3GcppPkg概览243
- 10.4测试GcppPkg246
- 10.5本章小结248
- 第11章GUI基础249
- 11.1字符串249
- 11.1.1字符串函数249
- 11.1.2字符串资源251
- 11.1.3管理字符串资源255
- 11.2管理语言260
- 11.3包列表262
- 11.4图形界面显示263
- 11.4.1显示模式264
- 11.4.2Block Transfer(Blt)传输图像267
- 11.4.3在图形界面下显示字符串269
- 11.5用SimpleFont显示中文272
- 11.5.1 SimpleFont 格式273
- 11.5.2如何生成字体文件275
- 11.5.3如何注册字体文件276
- 11.6开发SimpleFont字库程序277
- 11.7字体Font278
- 11.7.1Font的格式279
- 11.7.2字体包的格式279
- 11.7.3为什么Font性能高于SimpleFont281
- 11.8本章小结284
- 第12章GUI应用程序285
- 12.1UEFI事件处理285
- 12.1.1键盘事件285
- 12.1.2鼠标事件292
- 12.1.3定时器事件293
- 12.1.4UI事件服务类294
- 12.2事件处理框架297
- 12.3鼠标与控件的绘制302
- 12.3.1鼠标的绘制303
- 12.3.2控件的绘制305
- 12.4控件系统包GUIPkg306
- 12.5简单视频播放器的实现309
- 12.6本章小结315
- 第13章深入了解多任务317
- 13.1多处理器服务317
- 13.1.1EFI_MP_SERVICES_PROTOCOL功能及用法317
- 13.1.2启动AP的过程324
- 13.2内联汇编基础和寄存器上下文的保存与恢复333
- 13.2.1内联汇编基础333
- 13.2.2寄存器上下文的保存与恢复335
- 13.3多线程336
- 13.3.1生成线程337
- 13.3.2调度线程340
- 13.3.3等待线程结束341
- 13.3.4SimpleThread服务341
- 13.4本章小结345
- 第14章网络应用开发346
- 14.1在UEFI中使用网络348
- 14.2使用EFI_TCP4_PROTOCOL350
- 14.2.1生成Socket对象352
- 14.2.2连接356
- 14.2.3传输数据358
- 14.2.4关闭Socket361
- 14.2.5测试Socket362
- 14.3本章小结363
- 第15章使用C标准库364
- 15.1为什么使用C标准库函数364
- 15.2实现简单的Std函数365
- 15.2.1简单标准库函数包sstdPkg366
- 15.2.2使用sstdPkg368
- 15.3使用EDK2的StdLib369
- 15.3.1main函数工程369
- 15.3.2非main函数工程374
- 15.4本章小结376
- 第16章Shell及常用Shell命令377
- 16.1Shell的编译与执行377
- 16.2Shell服务379
- 16.3Shell脚本385
- 16.3.1Shell脚本语法简介385
- 16.3.2自动运行指定应用程序388
- 16.4Shell内置命令388
- 16.4.1调试设备的相关命令388
- 16.4.2驱动相关命令390
- 16.4.3网络相关命令392
- 16.5本章小结394
- 附录AUEFI常用术语及简略语395
- 附录BRFC 4646常用语言列表397
- 附录C状态值398
- 附录D参考资料400