2009年9月27日 星期日

EFI/UEFI BIOS 入門 : All For Beginners

我們已經使用BIOS超過了二十年.可是直到今天還友許多朋友不知道BIOS到底是什麼,以及它主要做些什麼事情,它在整個個人計算機之中所處的地位如何.事實上,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 architecture.

上面這句話是我在初學BIOS的時候,我的老師,一位受到整個業界尊敬的杰出BIOS Engineer對我說的,這段話雖然短,但是卻清楚的道出了BIOS的基本功能,那就是:

1. 檢測硬體,又叫POST.

2. 初始化硬體,設置其基本狀態,使得整個計算機達到所謂的"可用狀態"(Ready State).

3. 啟動OS Loader加載操作系統.

4. 在操作系統啟動起來以後,一部分繼續駐留內存(記憶體),向操作系統以及其他軟體提供基本的系統級的服務.如磁碟讀寫等.

5. 修復硬體缺陷.

下面我們一個一個的來看這些功能.

(第一個)檢測硬體可能比較好理解一點,就是看看你的硬體是否還正常的工作,但是從軟體的角度看.其中最重要的就是對內存的檢測的.大家都還對剛開機的時候內存的大小一直在跳的螢幕有記憶吧,那就是在做Memory Test,或者說Memory Sizing.

(第二個)功能是初始化硬體,可能有不少朋友問:為什麼我的硬體還需要初始化?問的好,硬體的設計廠家往往為了通用市場的考慮,不願意將硬體設計成定制的狀態,可能一個網卡,可以安裝在PC,同樣也可以安裝在嵌入式系統上.所以為了使得硬體能夠按照PC的架構工作,BIOS必須要按照由 IHV(Independent 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 Management 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)之間的一套完整的接口(interface)規範。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中作到的許多事情.后面的文章我會逐步展現給大家.


EFI 並非近期才出現的設計,在蘋果電腦MAC OS X已經使用很長一段時間,然而一般PC依然還是使用傳統DOS時代的16-bit BIOS,功能顯得有些不足。先進的EFI是由C/C++寫成,運行在32-bit或64-bit模式下,第一眼帶給人的感覺是「支援滑鼠的圖形化 BIOS」,然而,EFI並不只有美化外觀這麼簡單,它提供預載模組化驅動程式的可能性,這才是EFI最大的優勢。


一些常見的關于BIOS/EFI的問題以及我的簡短回答:
1) BIOS一般有多大?
傳統bios(以後說legacy bios)一般都是512KB,而早期的EFI bios也是512KB.現在EFI基本上是1MB了.
2) BIOS用什麼工具開發?
legacy bios一般用MASM 6.11開發,同時還會配上一些廠商自己寫的build tools. EFI則使用Visual 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應用程序.



File system 百百種, 光 windows 就 fat, fat12, fat16, fat32, NTFS vN, Unix/Linux 就更是數不完了, 再加上 raid... 現在 Linux 常用的 grub, lilo 這種放在 HD 上的 loader 都沒法吃下所有 file system 了, 容量小小的 BIOS 怎麼能做得到呢?


下面是一些深入學習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



轉載自:
http://www.huarw.com/program/assembler/assembler01/200804/1561026.html

沒有留言:

張貼留言