UEFI原理与编程(一):环境搭建

前言

最近在搞UEFI环境下的一些编程。对于我这种从未接触过EFI的菜鸟程序员来说,前面开发环境搭建,编程细节等等在没有人指导情况下,走了很多弯路。在网上查资料的时候,也有发现网上面的资料大多过时,或有关键步骤的缺失,碰壁不少。今天我就详细的把我这几天被搞的体无完肤的过程分享一下,希望有和我一样刚接触UEFI编程的各位能有一些帮助。

一、EDK II and Support Tool Download

1、做UEFI开发的话,首先需下载EDK II环境,可以在官网下载,也可以在SourceForge上面查找,下面贴出 EDKII的github:
                   https://github.com/tianocore/edk2.git

如果你看到众多名字如:EDK、EDKII、UDK2010、UDK2014、UDK2015....,解释如下
a、EDK 较早的东西了
b、是现在Intel力推
c、UDK比较稳定的EDKII
注:解释来自于 biosren。在选择下载那个版本的时候,我开始是抱着求稳态度,下载一些低版本,后来在时间过程中各种坑,弄得是灰头满面。所以我推荐就去github上下载最新的吧,至少我用到现在没发现什么问题。PS(我下的是UDK2015,前几天看最新已经有UDK2017 了  -。-!!!)
2、VS2008 (确保64位编译器也有),你也可以选择其他的版本如:VS2010,。其实当你安装了EDKII之后,你可以在Conf\tools_def.txt 这个文件下看到所有编译器,而且要要查它的配置是否正确,这个后面会有提到。那么现在我就列出我现在安装的UDK2015下面所支持的:
a、VS2003(32bit)
b、VS2005(32bit、64bit)
c、VS2008(32bit、64bit)
d、VS2010(32bit、64bit)
e、VS2012(32bit、64bit)
f、VS2013(32bit、64bit)
g、DDK3790 
h、UNIXGCC
i、 GCC44 - GCC49
k、CLANG35 
l、 ELFGCC
 j、CYGGCC
k、ICC\ICC11
当然这些根据你下载的EDKII的版本情况而定,而我现在用的就是VS2008。 VS这个大块头做软件的应该都知道。
3、Windows SDK,下载了安装了VS应该都有,如果没有的话可以自己去官网下载。        

4、IASL compiler
http://www.acpica.org/downloads/binary_tools,ps:打不开的话,自己Google/ baidu,自行下载就好,下载好后把它们COPY到C:\ASL里面。原因后面会讲,我曾在这里进过坑。

5、openssl-1.0.2d package + patch 
其实就是需要用patch对openssl打补丁,具体操作可以看UDK2015.Complete.MyWorkSpace.zip 里面 MyWorkSpace\CryptoPkg\Library\OpensslLib\Patch-HOWTO.txt
其实不看也没有关系,我在后面会有讲到,但是 注意如果你的版本与我选择的不一样,你需要看看上面我说的那个说明文档查看具体操作

6、EADK
EADK 提供了标准的库,包含了一些C的stand library,并且提供了浮点运算的可能。 Just for UEFI Application!
注:如果使用UDK2015 或>2015,请下载教新的EADK, Do not use EADK1.02 或EADK_A2 !

二、EDKII Setup

1、将UDK2015解压
因为我们用的是Windows,所以我们将Base Tool(Windows).zip 和UDK2015.MyWorkSpace.zip 解压到 :D:\EDK2 文件夹下
注意,如果你看有些网上资料和一些书本(UEFI原理与编程)描述的结构是将UDK2015.MyWorkSpace.zip解压后MyWorkSpace文件夹下的内容提到了D:\EDK2文件夹下,你可以解压之后把它们提到父目录D:\EDK2里面,与一些教程资料保持一致。当然,如果你知道这些,在你build的时候可以自己定义配置。
2、Generate OpenSSL * Crypto Library
其实这步在前面有提到过,我发个图片:
          
在最下面Patch-HOWTO.txt 里面有详细的步骤。我大概吧里面的内容贴出来,你如果想看详细的,可以去查看这个file。
For Windows Environment:
    ------------------------
    1) Make sure the patch utility has been installed in your machine.
       Install Cygwin or get the patch utility binary from
       http://gnuwin32.sourceforge.net/packages/patch.htm
 
  2) cd $(WORKSPACE)\CryptoPkg\Library\OpensslLib\openssl-1.0.2d
    3) patch -p0 -i ..\EDKII_openssl-1.0.2d.patch
    4) cd ..
    5) Install.cmd

3、将IASL 解压,然后把编译器copy到C:\ASL文件夹下
这些前面有说过,具体原因,还得往下看   -。- h

4、打开用管理员权限打开CMD,进到 D:\EDK2 : CD /D D:\EDK2 ,运行 edksetup.bat  结果如下:

注意: 请忽略 WARNING 的内容

5、这时候,你需要打开EDK2文件夹,发现里面有一个Conf的文件夹,打开后,我们需要对其中target.txt 和 tools_def.txt 连个文件进行配置。
                                                                            
a、target.txt 主要是对TOOL_CHAIN_TAG,进行配置,这里偷懒引用 UEFI原理与编程上面的图:
                                            
            请注意,32位机器,填写的是VS200?,而64位机器32位VS 才填 VS200?x32
b、tools_def.txt 主要是检查自己的编译器的路径是否正确
比如我的VS2008是装在D:\Visual Stadio2008,那么我设置的路径也要正确,如下:
         
             请注意,请根据自己情况进行设置。
好了,我们在这里仔细查找发现了,tools_def.txt 对IASL的默认设置,直接上图:


发现它的路径默认是C:\ASL,好了前面留的悬念解释了。如果你想自定义的话,保持一致就好!
6、下面我们要讲一下NT32模拟器的编译。
首先,这一步的目 的可以再NT32模拟环境下运行我们的EFI文件,我们就可以在模拟环境下对efi文件进行测试了interesting,当然,使用模拟环境是有缺陷的,后面再讲。
步骤:
a、D:\EDK2>edksetup.bat --nt32
b、D:\EDK2>build
注:在步骤b可能会花一点时间去build,这是可以理解的。
c、build完之后,如果没有什么问题,它应该是这个样子的:

        或许你已经看到,我build只花了30s,这不是我机器性能比较好,这只是因为我之前已经build过了。而这次的build只是检查了与上次build的改动。如果你查看生成的文件,你会发现他们的修改日期是你上次build done的时间。当然前提你没有对文件进行改动,如果改变了,肯定会花点时间去重新build的。
7、讲一下如何运行NT32模拟器
非常简单: build run
但是,请注意,在你build run 之前,你需要运行 edksetup.bat 来加载edkii的环境。
8、退出NT32模拟环境
just use: reset 命令即可!

三、利用U盘进行UEFI启动

        其实,估计你已经在网上或参考书上查过了怎么制作,可你还是失败了,尤其是在Legacy BIOS平台下。但是我在实际操作过程中,发现有漏步骤的情况,原因应该是版本的原因。
         讲一下这里是干嘛的:前面又提到在NT32模拟环境下有些缺陷,目前我遇到的是UEFI编程中,我们会使用到protocol,但是在NT32模拟环境下有些protocol并没有设备进行挂载。以至于我们不能测试我们的程序。此时就需要我们在本机UEFI环境下进行测试。我还遇到过其他的情况,在此不一一列举,前面不知道有这一情况,我真是被搞得不要不要的 - 。-!
1、首先介绍在UEFI平台下USB盘制作
easy,估计你在网上查过 简单说: 1、格式化U盘 FAT(我是FAT32)
    2、U盘建立efi\boot
    3、将efi程序COPY到上面目录,重命名为bootia32.efi 或 bootx64.efi 看你是属于哪个
Ok了。
原理其实就是UEFI的启动文件是上面路径下的boot文件。。。interesting。。。

2、Legacy BIOS 平台。

        其实大家都知道要用到DUET,我也是。但是刚开始我利用网上的教程,和参考书上的做法却不行,后来我查看DuetPkg 文件夹下的ReadMe.txt 发现UDK2015 需要多一个步骤,下面贴出详细步骤,当然你也可以去查看这个文件。
此处的U盘盘符设为e: ,根据自己的情况改动
a、build Duet platform module
->CD /D D:\EDK2
->edksetup.bat
->build -p DuetPkg\DuetPkg.dsc -e IA32    注:64bit :build -p DuetPkg\DuetPkg.dsc -e X64
->CD DuetPkg
->PostBuild.bat IA32   注:64bit:PostBuild.bat X64
b、Create boot disk
->插U盘
->CreateBootDisk.bat floppy e: FAT12 IA32   注 : 64bit : CreateBootDisk.bat floppy e: FAT12 X64   (资料网上缺此步,应该是原来版本是在最后一步完成的)
->CreateBootDisk.bat usb e: FAT32 IA32      注 : 64bit : CreateBootDisk.bat usb e: FAT32 X64       (资料网上缺此步,应该是原来版本是在最后一步完成的)
->拔出U盘,然后再插上
->CreateBootDisk.bat usb e: FAT32 IA32 step2   注:64bit  :CreateBootDisk.bat usb e: FAT32 X64 step2
      经过此步骤,就OK了。可以重启从U盘启动进行试验进入UEFI shell,输入fs0:就可以进入U盘的根目录了。。。。interesting
DUET 是基于Legacy BIOS 提供了UEFI模拟器,提供了在传统BIOS系统上的UEFI环境。
3、在这里的坑内挣扎很长时间,因为我的efi程序根本无法运行。现在有了这步,就可以对自己写过的程序进行测试了interesting

注:在此环境下UEFI的Shell 命令是可以很好地运行的,你可以试一下,比如
Shell》PCI    # 这个命令会列出你的机器上PCI Device ,包括BUS DEV FUN VID DID  CLASSNAME 等信息。

4、总结

     到此,EDKII SETUP 都写完了。前一段时间部门开会,BIOS那边的一位leader说过一句话:“只有做BIOS的才懂BIOS人。”确实,对于我这个做软件的之前没有了解过BIOS/EFI,在这短短几天接触EFI让我头大。不是难得不行,而是缺乏中文资料,问题得不到解答,只能自己不断尝试,不断的查看Spec。头痛的60%与看英文Spec有关 -。- !!!。 所以,这篇文章主要针对要写EFI程序的但是从未接触过EFI但是需要搭建EFI环境的软件人员。 只希望,各位能顺利搭建环境,写好代码,Build成功,测试OK,完成任务,然后远离这些东西,珍爱脑细胞 -。-!!!



  • 18
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: UEFI(Unified Extensible Firmware Interface)是一种固件接口标准,用于用于替换传统的BIOS(Basic Input/Output System)固件,旨在提高系统启动速度、安全性和可靠性。 UEFI原理编程完整版PDF是一份详细的技术指南,提供了UEFI开发所需的全部信息,包括如何设计UEFI驱动程序、应用程序和固件,以及如何使用UEFI的各种功能。 这份PDF文件将UEFI划分为四个主要模块:启动服务、管理服务、硬件抽象层和UEFI Shell。每个模块都有详细的描述和示例代码,此外还包含了UEFI的系统架构、数据结构、驱动程序与应用程序的开发方法等内容。 此外,UEFI原理编程完整版PDF还介绍了UEFI与安全性、多核技术、嵌入式系统等方面的关系,并为读者提供了关键的UefiSpec和UefiDebugTools库文档。 总之,UEFI原理编程完整版PDF是一份权威的技术指南,涵盖了UEFI方方面面的内容,非常适合开发人员和工程师学习和参考。 ### 回答2: UEFI(Unified Extensible Firmware Interface)是一种新型的启动编程接口,它替代了旧版的BIOS(基本输入输出系统)。UEFI原理编程可以帮助开发人员理解UEFI的工作原理编程技巧。 UEFI拥有完善的安全性和可靠性,其编程方式也十分灵活。与BIOS相比,UEFI可以支持更多的硬件平台和更大的硬盘容量,同时也可以优化启动速度和程序的执行效率。 UEFI原理编程pdf完整版可以帮助开发人员更好地了解UEFI的概念和架构,并提供丰富的代码示例,帮助开发人员快速掌握UEFI编程技能。除此之外,该书还介绍了UEFI的启动流程、安全策略、UEFI应用的开发和调试等内容,对于想要深入学习UEFI编程开发人员来说是一本很有价值的参考书。 总之,UEFI原理编程pdf完整版是一本优秀的技术参考书,其内容涵盖了UEFI的方方面面,对于想要深入了解和运用UEFI开发人员来说具有很高的参考价值。 ### 回答3: UEFI(Unified Extensible Firmware Interface)是一种新型的系统固件接口,它为操作系统与硬件之间提供了一种标准的接口。相比传统的BIOSUEFI可以支持更多的硬件功能,同时也更加安全和灵活。 UEFI原理主要包括以下几个方面:1、UEFI接口包括了启动管理器,硬件抽象层,运行环境和应用层等模块;2、UEFI支持模块化设计和驱动加载,可以动态地加载和卸载硬件驱动,提高了系统灵活性和安全性;3、UEFI使用GUID Partition Table(GPT)替代MBR分区表,支持更大的硬盘容量和更稳定的系统启动;4、UEFI还支持Secure Boot功能,可以防止恶意程序篡改启动软件和系统文件,提高了系统安全性。 关于UEFI编程,需要掌握以下几个核心内容:1、UEFI开发环境的搭建,需要熟悉UEFI规范以及系统固件接口的程序编写;2、UEFI应用程序的设计和开发,可以利用UEFI提供的应用程序接口(API)或者开发自定义的应用程序;3、UEFI驱动程序的编写,需要掌握UEFI驱动程序的架构和编程模型;4、UEFI启动管理器的开发,需要熟悉UEFI启动管理器的设计和实现。 总之,UEFI是一种新型的系统固件接口,可以为操作系统和硬件提供一个标准的接口,提高系统的安全性和灵活性。对于UEFI编程的学习和掌握,则需要对UEFI规范和程序设计有深入的了解。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值