天天看點

可擴充固件接口

可擴充固件接口(英文名extensible firmware interface 或efi)是由英特爾,一個主導個人電腦技術研發的公司推出的一種在未來的類pc的電腦系統中替代bios的更新方案。bios技術的興起源于ibm pc/at機器的流行以及第一台由康柏公司研制生産的“克隆”pc。在pc啟動的過程中,bios擔負着初始化硬體,檢測硬體功能,以及引導作業系統的責任,在早期,bios還提供一套運作時的服務程式給作業系統及應用程式使用。bios程式存放于一個掉電後内容不會丢失的隻讀存儲器中,系統加電時處理器的第一條指令的位址會被定位到bios的存儲器中,便于使初始化程式得到執行。

efi的産生

衆所周知,英特爾在近二十年來引領以x86系列處理器為基礎的pc技術潮流,她的産品如cpu,晶片組等在pc生産線中占據絕對上司的位置。是以,不少人認為這一舉動顯示了英特爾公司欲染指固件産品市場的野心。事實上,efi技術源于英特爾安騰處理器(itanium)平台的推出。安騰處理器是英特爾瞄準伺服器高端市場投入近十年研發力量設計産生的與x86系列完全不同的64位新架構。在x86系列處理器進入32位的時代,由于相容性的原因,新的處理器(i80386)保留了16位的運作方式(實模式),此後多次處理器的更新換代都保留了這種運作方式。甚至在含64位擴充技術的至強系列處理器中,處理器加電啟動時仍然會切換到16位的實模式下運作。英特爾将這種情況歸咎于bios技術的發展緩慢。自從pc相容機廠商通過淨室的方式複制出第一套bios源程式,bios就以16位彙編代碼,寄存器參數調用方式,靜态連結,以及1mb以下記憶體固定編址的形式存在了十幾年。雖然由于各大bios廠商近年來的努力,有許多新元素添加到産品中,如pnp bios,acpi,傳統usb裝置支援等等,但bios的根本性質沒有得到任何改變。這迫使英特爾在開發更新的處理器時,都必須考慮加進使效能大大降低的相容模式。有人曾打了一個比喻:這就像保時捷新一代的全自動檔跑車被人生套上去一個蹩腳的挂檔器。

然而,安騰處理器并沒有這樣的顧慮,它是一個新生的處理器架構,系統固件和作業系統之間的接口都可以完全重新定義。并且這一次,英特爾将其定義為一個可擴充的,标準化的固件接口規範,不同于傳統bios的固定的,缺乏文檔的,完全基于經驗和晦澀約定的一個事實标準。基于efi的第一套系統産品的出現至今已經有五年的時間,如今,英特爾試圖将成功運用在高端伺服器上的技術推廣到市場占有率更有優勢的pc産品線中,并承諾在2006年間會投入全力的技術支援。

比較efi和bios

一個顯著的差別就是efi是用子產品化,c語言風格的參數堆棧傳遞方式,動态連結的形式建構的系統,較bios而言更易于實作,容錯和糾錯特性更強,縮短了系統研發的時間。它運作于32位或64位模式,乃至未來增強的處理器模式下,突破傳統16位代碼的尋址能力,達到處理器的最大尋址。它利用加載efi驅動的形式,識别及操作硬體,不同于bios利用挂載實模式中斷的方式增加硬體功能。後者必須将一段類似于驅動的16位代碼,放置在固定的0x000c0000至0x000dffff之間存儲區中,運作這段代碼的初始化部分,它将挂載實模式下約定的中斷向量向其他程式提供服務。例如,vga圖形及文本輸出中斷(int 10h),磁盤存取中斷服務(int 13h)等等。由于這段存儲空間有限(128kb),bios對于所需放置的驅動代碼大小超過空間大小的情況無能為力。另外,bios的硬體服務程式都已16位代碼的形式存在,這就給運作于增強模式的作業系統通路其服務造成了困難。是以bios提供的服務在現實中隻能提供給作業系統引導程式或ms-dos類作業系統使用。而efi系統下的驅動并不是由可以直接運作在cpu上的代碼組成的,而是用efi byte code編寫而成的。這是一組專用于efi驅動的虛拟機器指令,必須在efi驅動運作環境(driver execution environment,或dxe)下被解釋運作。這就保證了充分的向下相容性,打個比方說,一個帶有efi驅動的擴充裝置,既可以将其安裝在安騰處理器的系統中,也可以安裝于支援efi的新pc系統中,而它的efi驅動不需要重新編寫。這樣就無需對系統更新帶來的相容性因素作任何考慮。另外,由于efi驅動開發簡單,所有的pc部件提供商都可以參與,情形非常類似于現代作業系統的開發模式,這個開發模式曾使windows在短短的兩三年時間内成為功能強大,性能優越的作業系統。基于efi的驅動模型可以使efi系統接觸到所有的硬體功能,在操作作業系統運作以前浏覽網際網路站不再是天方夜譚,甚至實作起來也非常簡單。這對基于傳統bios的系統來說是件不可能的任務,在bios中添加幾個簡單的usb裝置支援都曾使很多bios設計師痛苦萬分,更何況除了添加對無數網絡硬體的支援外,還得憑空建構一個16位模式下的tcp/ip協定棧。

一些人認為bios隻不過是由于相容性問題遺留下來的無足輕重的部分,不值得為它花費太大的更新努力。而反對者認為,當bios的出現制約了pc技術的發展時,必須有人對它作必要的改變。

efi和作業系統

efi在概念上非常類似于一個低階的作業系統,并且具有操控所有硬體資源的能力。不少人感覺它的不斷發展将有可能代替現代的作業系統。事實上,efi的締造者們在第一版規範出台時就将efi的能力限制于不足以威脅作業系統的統治地位。首先,它隻是硬體和預啟動軟體間的接口規範;其次,efi環境下不提供中斷的通路機制,也就是說每個efi驅動程式必須用輪詢的方式來檢查硬體狀态,并且需要以解釋的方式運作,較作業系統下的驅動效率更低;再則,efi系統不提供複雜的存儲器保護功能,它隻具備簡單的存儲器管理機制,具體來說就是指運作在x86處理器的段保護模式下,以最大尋址能力為限把存儲器分為一個平坦的段,所有的程式都有權限存取任何一段位置,并不提供真實的保護服務。當efi所有元件加載完畢時,系統可以開啟一個類似于作業系統shell的指令解釋環境,在這裡,使用者可以調入執行任何efi應用程式,這些程式可以是硬體檢測及除錯軟體,引導管理,設定軟體,作業系統引導軟體等等。理論上來說,對于efi應用程式的功能并沒有任何限制,任何人都可以編寫這類軟體,并且效果較以前ms-dos下的軟體更華麗,功能更強大。一旦引導軟體将控制權交給作業系統,所有用于引導的服務代碼将全部停止工作,部分運作時代服務程式還可以繼續工作,以便于作業系統一時無法找到特定裝置的驅動程式時,該裝置還可以繼續被使用。

efi的組成

一般認為,efi由以下幾個部分組成:

1. pre-efi初始化子產品

2. efi驅動執行環境

3. efi驅動程式

4. 相容性支援子產品(csm)

5. efi高層應用

6. guid 磁盤分區

在實作中,efi初始化子產品和驅動執行環境通常被內建在一個隻讀存儲器中。pre-efi初始化程式在系統開機的時候最先得到執行,它負責最初的cpu,主橋及存儲器的初始化工作,緊接着載入efi驅動執行環境(dxe)。當dxe被載入運作時,系統便具有了枚舉并加載其他efi驅動的能力。在基于pci架構的系統中,各pci橋及pci擴充卡的efi驅動會被相繼加載及初始化;這時,系統進而枚舉并加載各橋接器及擴充卡後面的各種總線及裝置驅動程式,周而複始,直到最後一個裝置的驅動程式被成功加載。正因如此,efi驅動程式可以放置于系統的任何位置,隻要能保證它可以按順序被正确枚舉。例如一個具pci總線接口的atapi大容量存儲擴充卡,其efi驅動程式一般會放置在這個裝置的符合pci規範的擴充隻讀存儲器(pci expansion rom)中,當pci總線驅動被加載完畢,并開始枚舉其子裝置時,這個存儲擴充卡旋即被正确識别并加載它的驅動程式。部分efi驅動程式還可以放置在某個磁盤的efi專用分區中,隻要這些驅動不是用于加載這個磁盤的驅動的必要部件。在efi規範中,一種突破傳統mbr磁盤分區結構限制的guid磁盤分區系統(gpt)被引入,新結構中,磁盤的分區數不再受限制(在mbr結構下,隻能存在4個主分區),并且分區類型将由guid來表示。在衆多的分區類型中,efi系統分區可以被efi系統存取,用于存放部分驅動和應用程式。很多人擔心這将會導緻新的安全性因素,因為efi系統比傳統的bios更易于受到計算機病毒的攻擊,當一部分efi驅動程式被破壞時,系統有可能面臨無法引導的情況。實際上,系統引導所依賴的efi驅動部分通常都不會存放在efi的guid分區中,即使分區中的驅動程式遭到破壞,也可以用簡單的方法得到恢複,這與作業系統下的驅動程式的存儲習慣是一緻的。csm是在x86平台efi系統中的一個特殊的子產品,它将為不具備efi引導能力的作業系統提供類似于傳統bios的系統服務。

efi的發展

英特爾無疑是推廣efi的積極因素,近年來由于業界對其認識的不斷深入,更多的廠商正投入這方面的研究。包括英特爾,amd在内的一些pc生産廠家聯合成立了聯合可擴充固件接口論壇,它将在近期推出第一版規範。這個組織将接手規劃efi發展的重任,并将英特爾的efi架構解釋為這個規範的一個具體實作。另外,各大bios提供商如phoenix, ami等,原先被認為是efi發展的阻礙力量,現在也不斷的推出各自的解決方案。分析人士指出,這是由于bios廠商在efi架構中重新找到了諸如pre-efi啟動環境之類的市場位置,然而,随着efi在pc系統上的成功運用,以及英特爾新一代晶片組的推出,這一部分市場佔有率将會不出意料的在英特爾的掌控之中。  

可擴充固件接口

繼續閱讀