不知道诸位做UEFI开发的时候,是不是觉得UEFI下面构建一个单独的组件(.EFI文件)太麻烦了?每次都要写一个INF文件,而且写完了还要放到DSC文件里面。并且更讨厌的是,我明明只想生成一个EFI,为什么要向生成一个BIOS那样操作呢?虽然新版本的EDK具备了Build Module这样的功能,但是那些繁琐的步骤一个没少,并且有些明显是多余都build steps一个都不能少:如必须先生成tools,之后还要调用一些对构建单独Module根本不需要的tool来处理,如ProcessDsc等。
我们很多时候可能只需要生成一个驱动而已,想想大家在做开发的时候,基本上都是先写一个单独的驱动,然后在Shell下面用load指令加载到内存里,之后进行调试。当调试成功才会集成到BIOS内。如果是写UEFI应用程序,则更是如此,根本不需要那些多余的步骤。
可是受限于目前的EDK构建流程,想做但单独生成组件比较困难,而且更要命的是那另人发狂的生成时间!最新版的EDK具备了多线程编译技术,但是所谓的多线程只能达到组件级,换言之,单个组件内的源文件仍然是顺序编译的,无法做到并行编译。而且只有在生成最后的BIOS镜像的时候,这个EDK的多线程技术才能发挥其作用。而我们想生成单个组件的时候,则基本上没有什么帮助了。
INF文件的配置模式本身也是落后于时代的,目前在配置文件方面,整个软件业界已经进化到了XML时代。处理XML的效率远远过于处理INF。且XML语法由标准统一。
鉴于目前的这些困难,我自己开发了UEFI Module Builder这个小工具,希望能给大家一点帮助。它具备下面的特性:
1)专为生成独立的组件而设计,无需任何EDK工具支持。只要系统安装了VS以及MASM即可工作。为用户节省大量的工具构建时间。以及彻底避免了构建组件的时候先执行完全不需要的操作。
2)组件源文件级别的多线程编译支持。换言之,我们终于可以同时编译诺干个源文件了(包括C文件以及ASM文件)!大大提高组件生成时间,与EDK的Build Module相比,对于同一个组件,生成时间节约高达70%以上。
3)命令行方式交互,便于集成到更高一层的build chain内
4)采用XML配置,其他任意XML工具均可以修改配置文件,且语法及其简单,几乎不用学习
5)采用BSD协议,完全开放源代码给大家学习
附件是UEFI Module Builder的可执行文件以及例子。我选择两个组件来给大家演示,一个是我自己写的Hello World,这个比较简单,主要演示如何使用MB。另一个则我从EDK内随意挑选的一个实际的组件USBKb,大家可以对比一下采用MB以及按照传统方式编译,看看采用MB对编译性能的巨大提升。
附件内的GlobalConf.xml和ModuleConf.xml文件请按照实际情况加以修改。
----------------------------------------------------------------------------------------------------------------------------
UEFI Module Builder Getting Started
下面是使用MB生成HelloWorld的方法:(很多步骤只需一次,今后就不需要了)
1. 下载附件的MB.RAR
2. 解压文件到C:/MB
3. 进入C:/MB/Samples/HelloWorld
4. 修改C:/MB/Samples/GlobalConf.xml,只把你的VS以及MASM路径按照时间情况予以替换即可
5. 修改C:/MB/Samples/HelloWorld/ModuleConf.xml,按照实际情况修改其路径
6. 打开一个Console Box
7. 进入C:/MB/Samples/HelloWorld
8. 输入 set EDK_SOURCE = (实际EDK安装目录)
9. 输入 MB.EXE /nologo /force /dc ../GlobalConf.xml
10. 在Output目录下找到生成的HelloWorld.efi
其他的具体命令可以通过MB.EXE /help来获得。
欢迎大家发帖询问具体的情况,我会一一作答。
--------------------------------------------------------------------------------------------------
此外,此次的MB只是一个技术预览版,还有很多不足的地方,我会一一更正,希望大家多多提出有益的意见!
下载:http://www.biosren.com/viewthread.php?tid=1415&extra=