我们已经使用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

05-11 22:55