2008年9月25日 星期四

[轉貼]EFI/UEFI BIOS 入門 : All For Beginners – 另附深入學習指南以及有用的URL連接

我們已經使用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 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中作到的許多事情.后面的文章我會逐步展現給大家.

一些常見的關于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應用程序.


下面是一些深入學習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最難的在於同時支援業界幾乎所有的通用規範.

歡迎大家回帖提出相關問題. 我會在空閑時間一一作答.

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

3 則留言:

口十八 提到...

您好, 因對文中 "過去的legacy bios由於不帶文件系統,不得已選擇從硬碟上特定空間裝載程序的辦法,而EFI則附帶了完整的文件系統支持" 這段不是很能理解. 想請您幫忙解釋一下.

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

Unknown 提到...

聽您說EFI環境下工作的程式是使用Visual .Net 2003的環境下開發的...
能否使用Visual .NET 2005環境開發呢?
若可,要如何去開發,可以compiler *.EFI的檔案呢? 再麻煩您回覆一下,我E-mail 是 chrisan1030@yahoo.com.tw

匿名 提到...

您好:
我想請問一下,System Management Mode ,該如何進入 如何進去開發? 麻煩您回復一下,我的mail是ma030205@stust.edu.tw ,謝謝您.

一個小故事讓我們明白資金流通的意義

“又是炎熱小鎮慵懶的一天。太陽高掛,街道無人,每個人都債台高築,靠信用度日。這時,從外地來了一位有錢的旅客,他進了一家旅館,拿出一張1000 元鈔票放在櫃檯,說想先看看房間,挑一間合適的過夜,就在此人上樓的時候---- 店主抓了這張1000 元鈔,跑到隔壁屠戶那裡支付了他欠的肉錢...