电脑报官方论坛

 找回密码
 注册
查看: 48606|回复: 42

[教程分享] 挑战传统BIOS的UEFI固件     [复制链接]

自成一派

BSD Lover

Rank: 11Rank: 11Rank: 11Rank: 11

树叶
1061
金币
1592
积分
1080

斑竹纪念章 系统名医(操作系统)

发表于 2012-5-16 09:50:22 |显示全部楼层
本帖最后由 woodelf 于 2012-5-16 09:52 编辑

之前在《浅谈GPT》已经涉及了一点UEFI的基本知识(http://bbs.icpcw.com/thread-2258756-1-1.html),本帖目的就是要把UEFI和GPT结合起来进行一个全面介绍。


由于电脑教育普及,很多人都知道BIOS就是Basic Input/Output System,翻成中文是“基本输入/输出系统”,是一种所谓的“固件”,负责在开机时做硬件启动和检测等工作,并且担任操作系统控制硬件时的中介角色。


然而,那些都是过去DOS 时代的事情,自从Windows NT出现,Linux 开始崭露头角后,这些操作系统已将过去需要通过BIOS完成的硬件控制程序放在操作系统中完成,不再需要调用BIOS功能。一般来说,当今所谓的“电脑高手”,多半是利用BIOS来对硬件性能做些超频调校,除了专业人士外,鲜有人再利用 BIOS 进行底层工作。


可扩展固件接口(Extensible Firmware Interface,EFI)是 Intel 为全新类型的 PC 固件的体系结构、接口和服务提出的建议标准。其主要目的是为了提供一组在 操作系统加载之前(启动前)在所有平台上一致的、正确指定的启动服务,被看做是有近20多年历史的PC BIOS的继任者。


UEFI是由EFI 1.10为基础发展起来的,它的所有者已不再是Intel,而是一个称作Unified EFI Form的国际组织,贡献者有Intel,Microsoft,AMI,等几个大厂,属于开源项目,目前版本为2.3。与传统BIOS 相比,最大的几个区别在于:


1、编码99%都是由C语言完成;


2、一改之前的中断、硬件端口操作的方法,而采用了Driver/protocol的新方式;


3、将不支持X86实模式,而直接采用Flat mode(也就是不能用DOS了,现在有些 EFI 或 UEFI 能用是因为做了兼容,但实际上这部分不属于UEFI的定义了);


4、输出也不再是单纯的二进制code,改为Removable Binary Drivers;


5、操作系统启动不再是调用Int19,而是直接利用protocol/device Path;


6、对于第三方的开发,前者基本上做不到,除非参与BIOS的设计,但是还要受到ROM的大小限制,而后者就便利多了。


7、弥补BIOS对新硬件的支持不足的毛病。


UEFI的特点:


1.易于实现、容错和纠错特性更强


与BIOS显著不同的是,UEFI是用模块化、C语言风格的参数堆栈传递方式、动态链接的形式构建系统,它比BIOS更易于实现,容错和纠错特性也更强,从而缩短了系统研发的时间。更加重要的是,它运行于32位或64位模式,突破了传统16位代码的寻址能力,达到处理器的最大寻址,此举克服了BIOS代码运行缓慢的弊端。


2.驱动开发简单、兼容性好


与BIOS不同的是,UEFI体系的驱动并不是由直接运行在CPU上的代码组成的,而是用EFI Byte Code(EFI字节代码)编写而成的。对Java有一点了解的朋友,一定知道它的编译代码就是以“Byte Code”形式存在的,正是这种没有一步到位的中间性机制,使Java可以在多种平台上运行。UEFI也借鉴了类似的做法。EFI Byte Code是一组用于UEFI驱动的虚拟机器指令,必须在UEFI驱动运行环境下被解释运行,由此保证了充分的向下兼容性。


一个带有UEFI驱动的扩展设备既可以安装在使用安腾的系统中,也可以安装在支持UEFI的新PC系统中,它的UEFI驱动不必重新编写,这样就无须考虑系统升级后的兼容性问题。基于解释引擎的执行机制,还大大降低了UEFI驱动编写的复杂门槛,所有的PC部件提供商都可以参与。


3.高分辨率的彩色图形环境、支持鼠标操作


UEFI将让枯燥的字符界面成为历史!UEFI内置图形驱动功能,可以提供一个高分辨率的彩色图形环境,用户进入后能用鼠标点击调整配置,一切就像操作Windows系统下的应用软件一样简单。BIOS将不再是高手才能玩转的工具,光这一点就足以让很多菜鸟朋友心仪不已了。


UEFI的图形化设置界面:

20111111180744517191.jpg


4.强大的可扩展性


我们都知道,当电脑出现故障导致无法进入操作系统时,我们往往要借助其他工具才能解决问题,BIOS在诊断系统故障方面的作用实是在太小了。不过,UEFI将不会重蹈BIOS功能单一的覆辙!强大的可扩展性是UEFI的另一大优点。UEFI将使用模块化设计,它在逻辑上分为硬件控制与操作系统软件管理两部分,硬件控制为所有UEFI版本所共有,而操作系统软件管理其实是一个可编程的开放接口。借助这个接口,主板厂商可以实现各种丰富的功能。比如我们熟悉的各种备份及诊断功能可通过UEFI加以实现,主板或固件厂商可以将它们作为自身产品的一大卖点。如果你更习惯让别人来维护机器,UEFI也提供了强大的联网功能,其他用户可以对你的主机进行可靠的远程故障诊断,而这一切并不需要进入操作系统!要知道,如今的BIOS就是添加几个简单的USB设备支持都极其困难,更别说上网浏览网页了。


因此,UEFI可以说是介于固件和操作系统之间的一个中间接口。由于UEFI的这些特性,从理论上来说,可以大大加快操作系统的启动速度。


抛开以上那些专业的文字不谈,对于我们这些普通用户而言,UEFI带来的最大的便利,恐怕就是其图形化的硬件设置界面了。相对于传统的BIOS设置界面,UEFI的图形界面不仅更简洁,更优美,而且对用户更加友好(有简体中文支持,本人也用过不少电脑,BIOS设置基本是清一色的英文界面。印象里面貌似只有HP提供过繁体中文的BIOS设置界面)。


在目前的主板芯片组市场来看,Intel基本已经开始全面部署UEFI固件(从6系列芯片组开始,本人的笔记本是采用了HM65,已采用UEFI BIOS),而AMD的970,990以及A55和A75芯片组也已经部署UEFI(我的台式机是970芯片组,当时就奔着UEFI支持去的)。


以上只是PC机的情况,而在Macintosh平台,更是很早的时候就全面采用了EFI+GPT的组合(苹果这家公司的理念还是很超前的)。当然,和PC平台相比,苹果采用的是EFI 1.x,而目前PC平台普遍开始部署的都已经是EFI 2.0甚至2.1。貌似苹果也有把EFI升级到2.x的打算。


总体而言,UEFI目前已经开始有全面铺设的趋势了,虽然UEFI不算是新事物(印象里面是早在06还是07年就已经被提出了),但是前几年一直处于停滞状态,并没有大范围部署和推广。从2011年开始,Intel才再次在自家的芯片组上面真正开始大规模的部署。相信有很多人其实不知道自己的芯片组早已经内置了UEFI吧?


谈到UEFI,就不得不说到GPT。之前已经介绍过,如果要从GPT启动Windows,除了对Windows版本有要求之外,主板芯片组也必须支持UEFI。下面就来说说这两者的关系。


很多人可能会产生误解,以为UEFI和GPT是密不可分的,要使用GPT就必须要主板芯片组支持UEFI,事实上并非如此。


我在之前也已经说过,如果是打算从GPT启动Windows,那么UEFI就是必要的。但是对于Linux,则完全没有这种限制。当然,如果只是把GPT用作数据盘,则完全不用管芯片组是否支持UEFI,只需要操作系统支持就行了。


因此,UEFI和GPT可以说是独立的两个部分,并不存在一定的依赖关系。


下面就来具体说说UEFI和GPT的结合应用。


在我《浅谈GPT》一文中,我已经介绍过了如何把Windows或者Linux安装到UEFI+GPT的磁盘,这里我就再深入介绍下ESP所扮演的角色。


如下图,神秘的ESP分区结构在这里看得一清二楚。

2.PNG

可以看到,里面的ESP:\EFI\Microsoft\Boot文件夹的内容和结构和Windows 7系统分区(C盘)里面的Boot文件夹(隐藏属性)极其类似。所不同的是,ESP分区的一级目录只有EFI文件夹,下面我们再来看看具体里面有些什么吧。

3.PNG

在ESP:\EFI\Boot里面有一个bootx64.efi文件,这个文件就是基于UEFI+GPT的Windows引导文件。UEFI就是通过这个文件进行操作系统的引导(MBR分区表里面MBR引导程序的作用)。

4.PNG

这就是ESP:\EFI\Microsoft\Boot文件夹的具体内容了,里面也有几个efi的可执行文件,其中memtest.efi就是Windows的内存测试工具了。另外的bootmgfw.efi和bootmgr.efi文件就是微软引导管理器的相关文件了。


如果要在UEFI+GPT的磁盘装多系统,那么操作系统会把各自的EFI引导文件写入这个ESP分区,通过支持UEFI的引导管理器进行。EFI文件本身是个可执行文件,事实上,引导管理器所做的事情就是执行这个EFI文件。


如下图,在我的虚拟机装了Windows 7+Ubuntu以后的情况:

1.PNG

可以看到,在EFI设置菜单的引导管理界面可以直接进行双系统的选择,永远告别各种复杂的双系统甚至多系统引导项管理吧。


这是我安装Ubuntu以后的ESP分区,里面多了个ubuntu文件夹,下面只有一个grubx64.efi文件。不用说,这就是Grub2的efi引导文件了。

5.PNG

再结合上图,相信各位有过双系统甚至多系统安装经验的人都能够明白UEFI+GPT的引导机制和这种结构所带来的便捷性了。有了UEFI+GPT,我们不用再为如何进行双系统或者多系统引导而发愁了,这就是很好的解决方案。


如果配合了图形化的UEFI设置界面,那将是多大的便利啊,只要动动鼠标,就能告诉你的PC机应该引导所安装的哪个操作系统。当然,可能也有存在的问题,那就是每次都要按快捷键选择引导哪个操作系统,否则就会直接进入上一次引导的操作系统。相信以后还会有改进,使得引导选项更便利。


上面提到efi文件的可执行属性,因此,你甚至可以编写个小游戏的efi文件,然后直接在UEFI的设置界面运行这个游戏。另外,ESP分区的efi文件都是可以通过EFI Shell的命令行界面执行的。不过具体的命令操作,恐怕得有点DOS或者Linux命令基础的人才能较快上手了。


尽管介绍了这么多,但是时至今日,UEFI仍然是一项尚未普及的技术。尽管Intel在2011年开始大规模部署,但是真正已经完成图形化EFI BIOS的主板厂商并不多,只有华硕,昂达等寥寥数家。希望随着技术的发展,UEFI以及图形化EFI BIOS能尽快得到普及。


PS:手头有华硕A55和A75板子的同学可以去看看自己的图形化EFI BIOS设置界面,那可是看得我流口水啊。
已有 6 人评分评分 金币 树叶 收起 理由
ranger76 + 1
冬夜de.雪 + 1 精品文章
waheihei + 1 精品文章,学习了。
钱云飞 + 1 我的笔记本 UEFI 不带GUI 外观就是 BIOS.
981090707 + 1 您太神了,感谢您,+1

总评分: 评分 + 5  金币 + 15  树叶 + 3   查看全部评分

/dev/ada1:Gentoo Linux+ZFS (GPT)
/dev/ada2:FreeBSD 9.1+ZFS (GPT)
个人网站:http://woodelf.org
开源OS爱好者:226246994

自成一派

BSD Lover

Rank: 11Rank: 11Rank: 11Rank: 11

树叶
1061
金币
1592
积分
1080

斑竹纪念章 系统名医(操作系统)

发表于 2012-5-16 09:54:19 |显示全部楼层
继续求加精,求加分。
/dev/ada1:Gentoo Linux+ZFS (GPT)
/dev/ada2:FreeBSD 9.1+ZFS (GPT)
个人网站:http://woodelf.org
开源OS爱好者:226246994

登峰造极

没有实力,只有热情

Rank: 10Rank: 10Rank: 10

树叶
1242
金币
32705
积分
880

斑竹纪念章 系统名医(操作系统)

发表于 2012-5-16 10:00:05 |显示全部楼层
最近太忙,闲下来慢慢看。先加精。
魔鬼词典之 优化 :就是胡乱改一些东西,为重装系统找到充足的理由的行为。

管理员

Fuck U

Rank: 12Rank: 12Rank: 12

树叶
5716
金币
64
积分
2898

贡献勋章 酷软先锋(酷软交流)

发表于 2012-5-16 10:25:30 来自手机 |显示全部楼层
我微星主板也是efi的  

自成一派

半个水货 半只小白

Rank: 11Rank: 11Rank: 11Rank: 11

树叶
631
金币
3204
积分
1084
发表于 2012-5-16 10:49:33 |显示全部楼层
技术贴必须顶啊~

Rank: 8Rank: 8

树叶
22
金币
4869
积分
461
发表于 2012-5-16 14:29:13 |显示全部楼层
对于EFI过去只闻其名而无所了解,LZ的文章实在给力,因条件限制现在只能充忙一读,有一个感觉如果把BIOS比喻成DOS,那么EFI就相当于一个精简的WindowsPE。有几个疑问1,他的大小有没有规范要求?2,内置的驱动程序是在主板出厂前就封装好的还是像我们平常一样是在某个操作系统下实现安装。如果是前者如向更新及确保兼容?如果是后者又是如何"写"到EFI中?

自成一派

BSD Lover

Rank: 11Rank: 11Rank: 11Rank: 11

树叶
1061
金币
1592
积分
1080

斑竹纪念章 系统名医(操作系统)

发表于 2012-5-16 15:24:37 |显示全部楼层
caiqiang 发表于 2012-5-16 14:29
对于EFI过去只闻其名而无所了解,LZ的文章实在给力,因条件限制现在只能充忙一读,有一个感觉如果把BIOS比喻成 ...

其实我应该已经写明了。
1、通常而言,UEFI的ROM大小是4MB甚至8MB,而传统BIOS只有512KB。
2、驱动程序是封装在UEFI里面的,在BIOS之家有个UEFI版块,不少人就是为UEFI写驱动的。关于兼容性,我怀疑UEFI说不定和Linux内核类似,内置大量的硬件驱动。要知道,就算把驱动都编入Linux内核,通常的Linux内核也都能控制在3-4MB以内,而这么小的一个东西就已经可以支持成千上万的硬件了,何况UEFI还有4-8MB的空间。
/dev/ada1:Gentoo Linux+ZFS (GPT)
/dev/ada2:FreeBSD 9.1+ZFS (GPT)
个人网站:http://woodelf.org
开源OS爱好者:226246994

功成名就

无产阶级码农

Rank: 9Rank: 9Rank: 9

树叶
217
金币
13893
积分
521

SecurityExpert(病毒与安全)

发表于 2012-5-16 17:01:29 |显示全部楼层
可惜老一辈的主板都支持不了
头像被屏蔽

别发言

树叶
16
金币
12031
积分
239
发表于 2012-5-17 08:34:11 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽

功成名就

OS Beginner

Rank: 9Rank: 9Rank: 9

树叶
238
金币
11720
积分
658

系统名医(操作系统) SecurityExpert(病毒与安全)

发表于 2012-5-18 18:36:46 |显示全部楼层

RE: 挑战传统BIOS的UEFI固件

woodelf 发表于 2012-5-16 15:24
其实我应该已经写明了。
1、通常而言,UEFI的ROM大小是4MB甚至8MB,而传统BIOS只有512KB。
2、驱动程序 ...

Initrd啊……那个大!
您需要登录后才可以回帖 登录 | 注册


感谢版主

Archiver|手机版|电脑报官方网站 ( 渝ICP备10009040号 

GMT+8, 2017-9-24 16:48

回顶部