现在的位置: 首页 > 综合 > 正文

关于EFI的一点介绍

2013年08月08日 ⁄ 综合 ⁄ 共 7208字 ⁄ 字号 评论关闭

本文主要分为如下几个部分:
1, EFI Overview :主要从整体上去描述一下什么是EFI。以及应用EFI对我们可能带来的好处。
2, Framework : 从原理,架构等几个方面重点介绍了EFI规范的一种标准实现Intel Platform Innovation Framework for EFI(以下简称Framework)。
3, Development Tools :重点介绍了目前由AMI提供的开发工具Visual eBIOS。并简单探讨了Insyde公司的相关工具。 同时还介绍了American Arium公司提供的硬件仿真器以及调试软件Source Point。
4, EFI Development : Applications & Drivers :详细探讨了EFI开发的一些细节问题。并分析了一个简单的EFI Applications。同时还探讨了EFI Drivers。
5, EFI Shell :探讨了EFI Shell。

以上是主要的几个讨论方向,具体还会细分,详见正文部分。

1,EFI Overview EFI综述

1.1 Problems on legacy BIOS 传统BIOS所面临的难题
在仔细的探讨EFI之前,我们先来回顾一下什么是BIOS。BIOS是英文Basic Input/Output System的缩写,意为基本输入输出系统。从IBM于上世纪八十年代初推出了全世界第一台PC机开始,BIOS就成了个人计算机必备的系统软件,用于管理基本的硬件,提供各种中断调用,引导操作系统等等。可以看出,BIOS对于个人计算机来说,是非常重要的系统软件,没有BIOS的计算机是无法运行的。
传统上的BIOS经过了长达20多年的时间,基本上没有大的特别的改进,在操作系统已经完全32位化的今天,BIOS仍然停留在16位实模式时代。我们知道,在这个模式下,IA32架构的CPU只能访问1MB的基本内存,这就大大的***了程序员的创造性。同时,各种板卡上的BIOS在映射到系统内存中的时候,受到128Kbytes的大小***。这使得一台计算机不能安装太多的板卡,否则他们的BIOS的容量将很容易突破128Kbytes,但是在一些服务器上,安装很多板卡已经很常见。
同时由于BIOS一般选择采用汇编语言直接开发,使得开发入门难度很大。很多初级工程师甚至无法完成这样的任务。并且各个公司之间的代码不兼容,严重阻碍了其发展。

1.2 Intel’s solutions :EFI Intel的解决方案:EFI
EFI是Intel为了解决上述的BIOS难题而推出一项新技术,旨在向业界提供一种在未来20年内仍然可以应用的BIOS架构。EFI是Extensible Firmware Inte***ce的缩写。中文意思是可扩展固件接口。由于目前习惯上叫做EFI,本文将继续称其为EFI而不是它的中文译名。
正如它的名字一样,EFI并不是一套软件,而是一整套定义的很好的接口。它是一种规范,Intel目前已经正式发布了EFI Specification Revisions 1.10。任何人都可以按照EFI写出自己的实现来。而Intel也为我们准备好了一个标准的实现:Intel Platform Innovation Framework for EFI(以下简称Framework)。更加值得一提的是,Framework在BSD协议的规范下,已经实现了开放源代码,这为我们今后开发在EFI之上的应用提供了充分的技术保障。

1.3 Benefits of the EFI EFI的优点
EFI设计的充分原则就是屏蔽掉下层的硬件,事实上通过我们的分析,EFI已经很有操作系统的味道,EFI大概包括如下的几个部分:
1) Pre-EFI基础代码
2) 针对特定芯片的Pre-EFI模块
3) DXE基础代码
4) DXE驱动(Framework)
5) DXE驱动(硬件)
6) 兼容性支持模块CSM(可选,只支持IA32)
EFI通过上述的这些组成部分,提供了以往BIOS可以提供的全部功能,并且做了大量的更新。同时在容量上也做的相当的完美,可以放入4MB的Flash中。而启动速度和唤醒速度也符合HDG标准。
更加重要的是,EFI要求使用C语言作为开发语言,这样一来,使得我们可以更加容易的加入到BIOS的开发中来,同时也容易实现模块化与标准化。完全模块化的一个好处就是那些ODM或者OEM们可以方便添加他们想要的功能到EFI上。对我们而言,好处也是不言自明的,如果我们决定开始基于EFI的项目,那么我们可以在EFI中添加属于我们自己的模块,更加方便我们的用户的定制,甚至为用户提供个性化服务提供了可能。

1.4 Supported OS 操作系统系统支持情况
目前正式宣布支持EFI的操作系统包括Microsoft Windows Longhorn以及部分Linux。目前Longhorn已经进入了Beta1测试阶段,Intel也在一个DEMO中展示了用EFI来引导Longhorn的实际情况。同时展示的还有如何用EFI去引导RedHat Linux(需要借助一个第三方的开源软件ELILO)。至于其他的操作系统如Windows XP等,则暂时还不能支持EFI,所以只得使用CSM来达到引导目的。

2, Framework

2.1 Framework Overview 架构综述
简单的说,Framework就是EFI的一种实现,由Intel完成。完全实现了EFI Specification Revisions 1.10中提及的各项功能。开发者可以基于Framework,开发出各种EFI应用来。同时也可以为Framework新增新的功能。

2.2 Benefits of using the Framework 使用Framework的好处
最大的好处可以大大减轻我们的劳动量,我们只把注意力集中到最需要注意的地方上去,既然已经有了EFI的实现,并且是开源的实现,那么自然不需要我们再次实现一次。此外,Framework的其他一些好处还包括:
1) 跨平台Cross platform 目前Framework可以支持Intel IA32/64,XScale等硬件平台。同时我们注意到,Framework并不排斥其他平台,他拥有极高的可移植特性。
2) 模块化设计Model Design Framework的所有特性都在驱动程序之中实现。而Framework本身则提供了高效的管理这些驱动程序的方法。比方说,你可以load一个驱动,而不需要重新启动计算机;当你想更新已经load过的驱动,你只需简单将它unload,然后再load新的驱动就可以了。对我们开发者而言,可以通过编写我们自己的驱动,来为Framework提供我们自己需要的功能。
3) 快速的启动时间Fast Startup Time 正如EFI要求的那样,Framework的启动时间非常迅速,在这一点上,它一点也不比那些传统的BIOS落后。
此外,由于Framework是EFI的实现,所有EFI的优点应该说Framework也都具备。

2.3 The life cycle of the Framework Framework的生命周期
Framework的执行,是按照如下的顺序来的:
1) SEC :Security。这个是系统上电后立即进入的一个阶段,在这一阶段,Intel并没有做太多的说明,相反,他们说这个阶段可以由大家按照自己的需要利用。也就是说,我们可以安排我们自己想要的任何代码在这个阶段,比如一些身份验证之类的,总之,SEC可以说给开发者带来了充分的可定***务。
2) Pre-EFI :正如它的名字一般,这个是在真正的EFI环境之前进入的一个状态,这个状态相当重要,以至于Intel花了很多时间来向我们阐述。根据目前的信息,这个阶段大概会做很多初始化的工作,会初始化CPU,初始化主板上的一些控制器以及芯片组,更加重要的是,再这个阶段内,会使用一种技巧,来迅速的建立起C 代码的执行环境,也就是说,会建立一个堆栈。这样,以后机器就可以运行那些由C语言编写的软件了。最后PEI内核会按照一种方法来加载所有的PEIM( Pre-EFI Module )。PEIM是一种可以运行在这个阶段的一种模块化的程序,任何人都可以开发自己的PEIM,加载的工作由PEIM Dispatcher完成。全部加载之后,PEI会调用DXE Main并将系统控制权交给下一个阶段DXE。
3) DXE :Driver Execution Environment。这应该说是最激动人心的阶段,在这个阶段,EFI真正的提供了一个类似OS一样的东西。在上一个阶段PEI,系统已经建立了C代码执行的环境,那么从这个阶段开始,所有的东西,都是用高级语言完成了。进入DXE后,会首先调用各种驱动,比如Video Driver,NIC Driver,Soundcards Driver,USB Driver,PCI Controller Driver等等。完成之后,就开始进行BOOT。而这就是下一个阶段了。
4) BDS :Boot Device Select。在这里,应该会有一个选择,是进入OS呢?还是去执行那些EFI Applications ?选择完成之后,就进入下一个阶段了。
5) TSL :Transient System Load。这个阶段会按照在BDS阶段选择的结果来做不同的事情,如果选择了进入OS,那么控制权会被传递给Final OS Loader。而如果是要去运行EFI Applications,那么控制权交给Transient OS Boot Loader,这样就会建立起一个执行环境,之后就可以执行那些EFI Applications了。目前,应该会执行一个叫EFI Shell的程序。而传统的BIOS Setup也被写成一个EFI Applications。
6) RT :Run Time。这个阶段就是OS运行的阶段。
7) AL :After Life。这个是OS运行之后的阶段,比如关机之类的。但OS崩溃之后也属于这个阶段,也就是说,在系统万一崩溃之后,如果使用EFI,那么还是可以做许多事情的。
以上就是Framework的执行周期。我们可以看到,Framework除了做很多传统BIOS的工作之外,还完成了很多其他的工作。比如建立起高级语言执行环境,调用设备驱动等等。最值得注意的是,甚至还有一个执行特定应用程序的机会。

3,Development Tools 开发工具
3.1 Overview 综述
目前到底使用什么开发工具还不是很明晰。在这次Training上,为了给大家演示,使用的是Microsoft Visual Studio.NET 2003。不过那编译的是一个Emulator程序,用来模拟真实的EFI环境,况且由于EFI是系统软件,不太可能直接使用类似VS.NET这样的高级开发工具。
后来在EFI Driver Development这门课程上,一位HP的工程师认为只要是C Compiler,理论上都可以开发。但是如果要编译成EBC( EFI Byte Code )代码的话,那么还得向Intel购买相应的编译器。(我看了下价格,一个许可证是900多美金!靠!)将代码编译成EBC代码的好处就是,不同的硬件架构可以共同使用同一套最终的二进制代码。比如,如果一个设备的Option ROM内的程序是编译成EBC的话,那么该设备就可以不做任何的修改就可以直接支持IA32/64。而事实上,我们知道,目前Intel的64位安腾处理器与32位的Pentium4处理器在指令集上是不兼容的。那么这又是为什么呢?因为Intel在Framework内,提供了一个叫做EBC Virtual Machine Driver的Protocols。正是靠它,才实现了这样一个功能。
不过一些第三方厂商到是展示了不少很不错的开发工具。主要有AMI的开发工具Visual eBIOS,Insyde公司的调式工具H2ODDT,以及American Arium的硬件调式工具以及配套的软件SourcePoint。

3.2 AMI Visual eBIOS
VEB是一款非常出色的开发工具,由著名的BIOS Venders AMI提供。他为EFI提供了大量的Value Add的工具,AMI认为,Intel的EFI仅仅只是一个骨架(Skeleton)。而他们的VEB则为其穿上了衣服,并为不同的应用目的而做了大量的个性化开发。

3.3 Insyde H2ODDT
由于Insyde公司之前很少进入中国市场,所以我们对其产品了解不深,这款软件从介绍上看,似乎是专门用于调式Framework的。其余的详细细节还有待继续研讨。

3.4 American Arium
American Arium是老牌的硬件调式器供应商,他们这次带来了ECM-50与ECM-XDP。之间的差别似乎仅仅是ECM-XDP只支持那些使用XDP接口的处理器。而ECM-50则支持ITP与XDP接口。同时还演示了配套的软件SourcePoint。从展示来看,这似乎是目前最好的调式工具,可以直接从硬件上去调式,完全跟踪。并且支持C Source level的调试。不过根据我们猜测,这套调试工具的价格一定不菲。

4, EFI Development : Applications & Drivers
EFI 开发 :应用程序与驱动程序

使用EFI的一个很大的好处就是有EFI Application和EFI Drivers。我下来会分别给予讨论,事实上,Intel自己也认为,App和Driver在本质没什么不同。都是一段程序,只是他们的侧重点有所不同而已。App需要和用户交互,而Driver则主要提供某种服务。

4.1 EFI Applications EFI应用程序

4.1.1 Module of the EFI Applications EFI应用程序的类型
目前有好几种编写EFI Applications的方法,分别是基于EFI的,基于EFI Library的,基于C Library以及基于C Standard library的。根据Intel的说法,编译出来的应用程序的体积是一个比一个大,所以,如果想获得最小的体积,那么就应该使用基于EFI的方法,这也是Intel所推荐的。

4.1.2 A *** EFI Applications based on EFI 一个基于EFI的简单应用
最简单的方法就是亲自来看一个EFI App,下面我们就展示一个最简单的EFI App。

#include < efi.h >

EFI_STATUS
InitializeDemoApp(
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
SystemTable->ConOut->OutputString(SystemTable->ConOut, L“DEMO Application” ) ;
return EFI_SUCCESS ;
}

这个程序的工作很简单,就是打印一个字串到终端设备上。类似于我们常见的HelloWorld。从这个程序中,我们可以看出几点:
1) 所有基于EFI的应用成都必须包含头文件efi.h
2) 主函数必须被申明成EFI_STATUS
3) 必须在参数前加IN或者OUT或者OPTIONAL来说明参数的类型。这些修饰符是Intel在efidef.h中定义的。目前是空的,不过为了未来的兼容性,所以还是加上的好。
可以看出,单单就入门而言,由于是使用C语言开发,所以入门门槛很低,大多数的工程师都很轻松的加入到开发队伍中来。至于其他的编程模型,与上述的基于EFI的方法大同小异,只是所使用的库不同,在此就不在重复了。

4.2 EFI Drivers EFI驱动程序
现在简单的介绍一下EFI Drivers,事实上驱动程序与一般的应用没什么区别,只不过驱动不能直接执行,而是在EFI的调度下在后台执行,同时驱动可以接触硬件。当然也有不接触硬件的驱动,那叫Service Driver,是用来提供某种服务的,比如EFI EBC Virtual Machine就是一种Service Driver。EFI本身提供了很强大并且的高效的管理这些驱动的方法,当需要一个驱动的时候,我们可以load它,而当有了新版本或者该驱动所管理的硬件已经不在需要的时候,我们可以很方便的unload它。Intel已经提供了一个工具,叫DWW,用他可以很方便的生成基于EFI的驱动程序模型。

5, EFI Shell

5.1 EFI Shell Overview EFI Shell综述
什么是EFI Shell?首先它是一个基于EFI的应用程序,其次它非常类似我们在Windows中遇到的cmd或者在Linux中的shell。事实上,这就是一个操作环境,一个外壳程序,它负责接收用户的输入,将用户的输入解释并告诉内核执行,同时将执行结果显示出来。它完成和用户的交互功能。所以,EFI Shell是非常重要的应用程序。

5.2 EFI Shell Commands EFI Shell命令
EFI Shell使用字符界面和用户交互,这里列出一些可能用到的命令以便参考。
1) pci : 显示PCI设备或者PCI配置信息
2) mm :显示或者修改内存,I/O以及PCI资源。
3) mem :显示系统内存或者设备内存的情况。
4) memmap :显示由EFI Environment创建的Memory Map。
5) drivers :按照EFI Driver 的类型来逐一显示所有的已经安装的驱动程序。
6) devices :显示所有已经被EFI Driver控制的设备。
7) devtree :按照EFI Driver的类型来显示设备树。
8) dh :显示在EFI Environment中的所有的Handles。
9) connect :将一个Driver绑定到一个设备并启动设备。
10) load :将一个Driver读入内存。
11) unload :将一个Driver从内存中卸载。

抱歉!评论已关闭.