EFI/UEFI BIOS 入门 : All For Beginners - 另附深入学习指南以及有用的URL连接

prostar 2008-04-26 12:08:37
加精
写在前面

我们已经使用BIOS超过了二十年.可是直到今天还友许多朋友不知道BIOS到底是什么,以及它主要做些什么事情,它在整个个人计算机之中所处的地位如何.事实上,BIOS是整个计算机系统中最重要的底层系统软件.二十多年来,中国的程序员们纷纷忽略了BIOS,或者由BIOS衍生出的开发技术,相反,我们对如何调整一两个BIOS设置津津乐道.今天,BIOS业界开始悄悄的变革,EFI或者UEFI的到来即将改变世界,从而彻底改变我们对过去的计算机启动过程的认识.但是我们中国的开发者们仍然在谈论JAVA或者.NET,我想,是到了清晰的研究BIOS的时候了.

小生不才,但也愿意就我所学,贡献成一篇简短的入门文章,带领大家进入BIOS这个有趣而又充满了神秘的地域,我们一起来探究BIOS,尤其是探究下一代个人计算机的基础系统软件,或者说基础固件:UEFI bios的方方面面.由于类似的文章网上也比较多,所以我就重点谈些别人一般忽略的部分吧.

BIOS Definitions

BIOS -- Basic Input and Output System,is used for initializing,testing and putting the PC into the ready state so that an OS may be started.Part of the BIOS remains in the system main memory after POST,or Power On Self Test.BIOS provides a consistent software interface to varying types of the hardware devices.It also provides the basic system level services to OS.The BIOS is also used for helping IHV to fix their hardware design bugs by using the SMM mode of the IA architechture.

上面这句话是我在初学BIOS的时候,我的老师,一位受到整个业界尊敬的杰出BIOS Engineer对我说的,这段话虽然短,但是却清楚的道出了BIOS的基本功能,那就是:

1) 检测硬件,又叫POST.

2) 初始化硬件,设置其基本状态,使得整个计算机达到所谓的"可用状态"(Ready State).

3) 启动OS Loader加载操作系统.

4) 在操作系统启动起来以后,一部分继续驻留内存,向操作系统以及其他软件提供基本的系统级的服务.如磁盘读写等.

5) 修复硬件缺陷.

下面我们一个一个的来看这些功能.第一个检测硬件可能比较好理解一点,就是看看你的硬件是否还正常的工作,但是从软件的角度看.其中最重要的就是对内存的检测的.大家都还对刚开机的时候内存的大小一直在跳的屏幕有记忆吧,那就是在做Memory Test,或者说Memory Sizing.

第二个功能是初始化硬件,可能有不少朋友问:为什么我的硬件还需要初始化?问的好,硬件的设计厂家往往为了通用市场的考虑,不愿意将硬件设计成定制的状态,可能一个网卡,可以安装在PC,同样也可以安装在嵌入式系统上.所以为了使得硬件能够按照PC的架构工作,BIOS必须要按照由IHV(Indenpendent Hardware Vendor)提供的手册将硬件设置好,比如写几个必须的寄存器之类的,做一些enable的工作.这点非常重要,如果一个硬件没有enable,那么在OS下将不可见.

第三个功能是启动操作系统,这也是BIOS必须要做的事情之一.启动的方式是由BIOS规定,操作系统必须按照BIOS的要求来设计.这也是为什么操作系统从DOS一直到Vista,都只能把自己的loader放在MBR,因为BIOS只读MBR.强大的微软都必须要按照这个不成标准的标准来:)当然,在EFI时代,这一点有所改变,EFI支持的Boot From File不在需要MBR.

第四个功能可能之前作过DOS开发的朋友比较熟悉吧,还记得INT 10基本屏幕服务,INT 13磁盘服务吗?多少病毒正是靠INT 13来传播.又有朋友曾经试图绕过INT 10来直接写屏?Windows时代,这些东西事实上仍然存在,并且继续发挥着基本的核心作用,只是他们被Windows包装起来了,一般的程序无法接触到,但这并不能说明他们就没有用处了.MS的开发人员不久前还表示,事实上甚至就是开发中的Longhorn的安装程序,目前仍然有许多code是基于INT 10来写屏的.

第五个功能估计一般的朋友可能就不知道了,就是之前稍微接触过BIOS的朋友们可能也是第一次听说吧!Intel在它的CPU里专门留了个模式叫System Managment Mode,拥有最高的权限.SMM中断的时候,就连号称无所不能的Windows的也不知道,这样就可以给CPU扑bug了,举个例子,比如某天Intel的一个CPU对ADD指令给出错误操作结果,那么就可以利用SMM在每次执行这个指令的时候,中断一下,由BIOS软件给出正确的执行结果.这就达到了给硬件修复缺陷的目的.这样Intel也不用招回它的CPU了,呵呵.此外,每次BIOS开机的时候,事实上都会更新CPU Microcode,同样是用来给CPU补bug的.所以很多时候,刷BIOS刷出问题,事实上某个CPU的bug没有补上导致出了问题出现.



BIOS在哪里

上面罗嗦了一大堆的BIOS Basics,那么BIOS到底在哪里呢?答案是在你的计算机里:) 的确有些无聊,事实上BIOS有三种状态,分别是:

1) Before Build

2) BIOS Image

3) BIOS Runtime

第一种呢,这个时候BIOS表现为BIOS开发者硬盘上的一堆源代码. 处于第二种的时候,BIOS则是沉睡在Flash里的一段image.BIOS真正发挥作用是在第三种模式下,哪个时候BIOS执行,控制系统,与操作系统交互.



EFI BIOS

EFI是由Intel提出的,目的在于为下一代的BIOS开发树立全新的框架。EFI是英文Extensible Firmware Interfaces的缩写。正如它的名字一样,EFI不是一个具体的软件,而是在操作系统与平台固件(platform firmware)之间的一套完整的接口规范。EFI定义了许多重要的数据结构以及系统服务,如果完全实现了这些数据结构与系统服务,也就相当于实现了一个真正的BIOS核心。

EFI最早是在Spring 2000 IDF(Intel Developer’s Forum)上提出的,当时Intel认为,随着IBM在80年代初推出了第一台个人计算机开始,直到今天为止,个人计算机硬件平台已经发生了翻天覆地的变化,相关的系统软件如操作系统等也从最早的MS DOS1.0到今天的Windows XP,而作为整个系统的最底层也最为关键的系统软件之一的BIOS却基本上保持了架构二十年不变。这在整个软件史上都是一件不可思议的事情。如今,BIOS已经变成了严重阻碍IT产业前进的绊脚石,必须通过对BIOS的革新来为下一代的操作系统(如Windows Server Longhorn)提供更加强大的支持。

上面是我很早之前写的一段对EFI的介绍,现在看来,难免有些错误,不过大致意思非常明确,EFI就是用来替换传统BIOS.作为更好的BIOS,EFI可以提供过去无法在BIOS中作到的许多事情.后面的文章我会逐步展现给大家.


一些常见的关于BIOS/EFI的问题以及我的简短回答:
1) BIOS一般有多大?
传统bios(以后说legacy bios)一般都是512KB,而早期的EFI bios也是512KB.现在EFI基本上是1MB了.

2) BIOS用什么工具开发?
legacy bios一般用MASM 6.11开发,同时还会配上一些厂商自己写的buid tools. EFI则使用Viusal Studio.NET 2003以及MASM 6.11开发(没想到吧~)

3) EFI boot是怎么一回事?
EFI有自己独特的boot方式,完全抛弃掉了传统的0磁道0扇区的MBR概念.EFI的boot方式与文件系统息息相关.过去的legacy bios由于不带文件系统,不得已选择从硬盘上特定空间装载程序的办法,而EFI则附带了完整的文件系统支持,所以不再对硬盘有特定的要求,EFI下的操作系统加载程序事实上存储在boot\ia32\bootia32.efi文件里.(假定是IA32架构).这是一个EFI应用程序.


下面是一些深入学习bios的资源汇总:
1. BIOS Boot Specification
业内一般叫BBS,详细描述bios启动时必须要做的所有事情,如何区分启动设备,如何选择启动设备等等.
http://www.phoenix.com/NR/rdonlyres/56E38DE2-3E6F-4743-835F-B4A53726ABED/0/specsbbs101.pdf

2. UEFI Specification
UEFI规范,详细描述了UEFI bios必须支持的接口.以及UEFI bios的模型,提供的服务等等. 开发UEFI必备的.
http://www.uefi.org

3. Ralf Brown's Interrupt List
这个人似乎就一辈子都都在收集中断的东西,对legacy bios学习很有用.
http://www.ctyme.com/rbrown.htm

4. El Torito CD-ROM Boot
描述了bios如何从光驱上boot的细节.
http://www.phoenix.com/NR/rdonlyres/98D3219C-9CC9-4DF5-B496-A286D893E36A/0/specscdrom.pdf

5. USB Specification
USB设备规范
http://www.usb.org

6. Plug-and-Play Specifications
MS的PnP规范
http://www.microsoft.com/hwdev/tech/pnp/default.asp

7. BIOS Writer's Guide
bios开发的圣经,由cpu厂商给出.Intel的绝对看不到,Intel的是绝密级的文档.AMD的倒是可以看到,不同的cpu有不同的BWG.这里给出一个amd比较新的cpu的BWG:
http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/31116.pdf


还有很多很多相关的文档.其实编写bios最难的在于同时支持业界几乎所有的通用规范.


欢迎大家回帖提出相关问题. 我会在空闲时间一一作答.




...全文
162633 90 打赏 收藏 转发到动态 举报
写回复
用AI写文章
90 条回复
切换为时间正序
请发表友善的回复…
发表回复
woshi_ziyu 2012-08-27
  • 打赏
  • 举报
回复
这是一篇好文章啊
jerome_gh 2012-06-29
  • 打赏
  • 举报
回复
mark
  • 打赏
  • 举报
回复
您好,你有关于tpm的资料吗,在uefi shell中如何使用tpm命令?如何编写tpm的uefi应用程序?谢谢。
GoLden2eye 2012-05-25
  • 打赏
  • 举报
回复
没想到EFI和UEFI BIOS那么早就已经出来了
以前确实听过,但是一直都没碰到过,大多数情况下还是AWD和AMI的BIOS

想问下楼主P大,目前UEFI BIOS有没有类似以前 CBROM.EXE 这样类似的软件,可以OEM一些UEFI BIOS中的内容,比如LOGO、启动设备的优先顺序等等
a8897753 2012-05-22
  • 打赏
  • 举报
回复
make
attop 2012-01-17
  • 打赏
  • 举报
回复
不错,mark 一下 谢谢
oword 2011-10-21
  • 打赏
  • 举报
回复
ralf中断表,美好的回忆
tianyun2 2011-09-28
  • 打赏
  • 举报
回复
楼主牛人。
想请教您一个问题,我看beyond bios上面规定了一个FFS的flash文件系统规范,不知用户或者开发者如果想往uefi flash中加入一些程序的话,有没有统一的方式向flash中写入或读出数据?
Insider 2011-09-05
  • 打赏
  • 举报
回复
mark
next_ 2011-08-11
  • 打赏
  • 举报
回复
不错的帖子呢,好好看看
pro_or_gram 2011-07-29
  • 打赏
  • 举报
回复
不错,mark 一下 谢谢
popojw 2011-07-07
  • 打赏
  • 举报
回复
对入门者真的不错
vickyphan 2011-05-21
  • 打赏
  • 举报
回复
标记一下
niezhongzheng 2011-05-06
  • 打赏
  • 举报
回复
学习了,谢谢楼主的分享。
scvvi 2011-04-12
  • 打赏
  • 举报
回复
学习中, 多谢提供宝贵意见..
iwillbeback008 2011-01-02
  • 打赏
  • 举报
回复
楼主是做EFI的呀,不错不错,:-)

Vwang402 2010-12-29
  • 打赏
  • 举报
回复
不知道这个论坛里从事BIOS开发的人多不?我也是做BIOS的,做了3年多的LEGACY,现在在学习EFI.
JQ_Joana 2010-02-26
  • 打赏
  • 举报
回复
向PROSTAR学习~~
prostar 2010-02-24
  • 打赏
  • 举报
回复
上文打错了一个网址,不是ef.net,而是www.sf.net!
prostar 2010-02-24
  • 打赏
  • 举报
回复
引用 66 楼 mysjkmy 的回复:
我是新手,请教大家几个问题。

好象Intel把uefi项目提交给了开源社区,请问从哪可以获得 uefi 的源码和工具链?

目前 uefi 好象只支持Intel体系结构的CPU,如果要支持其他体系结构比如ARM、PPC、Alpha、Sparc等是否可以移植?


EDK2目前已经发布了ARM Cortex的移植版。可以在一片指定的板子上boot Linux了,你可以关注一下。ARM移植的主要推动力量是Apple。毕竟Apple选择了EFI作为其IPhone,IPod以及所有的Intel based Mac的固件。

EDK以及EDK2的代码可以从www.ef.net上搜索EDK项目获得。
加载更多回复(70)

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧