當前位置: 華文問答 > 數位

UEFI 引導與 BIOS 引導在原理上有什麽區別?

2013-09-20數位

作為UEFI/BIOS圈的業內人士,我十分驚訝的看到,UEFI和BIOS的概念在很大程度上還是模糊不清的。甚至 @木頭龍 這樣的硬體圈資深知友也讓我來介紹一下。我剛好借此此題來系統總結UEFI和BIOS的區別,和未來PC啟動固件的走向。

就本題而言,我可以負責任的說,UEFI和傳統BIOS在啟動引導過程原理上 沒有本質區別 !為什麽這麽說呢?那為什麽還要發明UEFI?UEFI將要向何處去?這些問題如同人類宗教起源的靈魂三問「我是誰,從哪裏來,將向哪裏去一樣「,會將看問題的深度提高到另一個層次。幸運的是,這些問題相對靈魂三問來講,有確定的答案,今天我就帶大家一起來探索一下。如果對這些問題不感興趣的同學,讀到這裏也就可以結束了。

UEFI和BIOS啟動過程有什麽不同嗎?

有些同學說起UEFI和傳統的BIOS區別,會如數家珍般的羅列MBR、PEI、DXE、UEFI分區啊這些東西,實際上這些全部是軟體層面的抽象,本身並沒有奇特的東西。傳統BIOS也可以做出改變支持PEI/DXE和UEFI分區等等,UEFI固件也可以支持支持傳統BIOS的環境,兩者並沒有功能上本質的區別。

實際上PC的啟動固件的引導流程從IBM PC機誕生第一天起,就沒有本質改變過 。如果我們透過SEC、PEI、DXE和BDS等等復雜的術語看幕後隱藏的本質,就會發現無論傳統BIOS還是UEFI,陽光之下沒有什麽新鮮的東西,啟動本身無外乎三個步驟:

1.Rom Stage :在這個階段沒有記憶體,需要在ROM上執行程式碼。這時因為沒有記憶體,沒有C語言執行需要的棧空間,開始往往是組合語言,直接在ROM空間上執行。在找到個臨時空間(Cache空間用作RAM,Cache As Ram, CAR)後,C語言終於可以粉墨登場了,後期用C語言初始化記憶體和為這個目的需要做的一切服務。

2. Ram Stage : 在經過 ROM階段的困難情況後,我們終於有了可以大展拳腳的記憶體,很多額外需要大記憶體的東西可以開始執行了。在這時我們開始進行初始化芯片組、CPU、主機板模組等等核心過程。

3. Find something to boot Stage : 終於要進入正題了,需要啟動,我們找到啟動裝置。就要列舉裝置,發現啟動裝置,並把啟動裝置之前需要依賴的節點統統打通。然後開始移交工作,Windows或者Linux的時代開始。

這就是傳統BIOS和UEFI的啟動過程,在剝去了術語後,主幹的三個步驟從來沒有變化過。熟悉嵌入式系統開發的同學會發現,大多數嵌入式系統啟動也大致是這些個步驟,從某種意義上講,PC啟動過程並沒有什麽特殊的。

傳統BIOS盡管開始全部用組合語言完成,但後期也部份引入了C語言,這些步驟完全是一樣的。什麽MBR分區啊,UEFI分區都是枝節問題,都是技術上可以做到的,沒有什麽是UEFI可以做,傳統BIOS不可以做到的。那麽問題來了,為什麽UEFI會替代傳統BIOS,UEFI展現了什麽獨特的魅力嗎?要理解這一點,我們先要看看PC啟動固件到底問什麽必須。

為什麽需要BIOS和UEFI?

與大多數人基本的概念不同,在某種意義上來說,X86體系比ARM體系更加開放。X86是很多小夥伴一起玩,以生態圈的概念提供產品,並對自己那部份負責;而ARM體系雖然也依賴生態圈,但最終有個大Boss統合整個生態鏈,提供最後產品並對該產品負總責。

X86生態圈玩家眾多,有OS 廠商(OSV)定期釋出作業系統,如Windows,Ubuntu;芯片廠商提供CPU,如Intel, AMD;主機板廠商(OEM)提供電腦主機板;獨立硬體供應商(IHV)生產擴充套件板卡如顯卡等等PCIE擴充套件卡,再如記憶體廠家推出一代一代不同的記憶體條等等。

DIY玩家可以自由選擇搭配合適/相容的產品搭配出自己心儀的機器,休閑上網使用者花2000多元就可以搭配出一套可用的電腦,而遊戲玩家則可能花費上萬元才能滿足遊戲配置需求。還有些品牌機廠商如Dell和聯想等,他們提供整套最終產品給使用者。但他們實際上是在所有小夥伴的零件基礎上拼湊出個產品,技術不強,話語權弱,並不能統一整個產業鏈。使用者津津樂道的反而是用的什麽CPU,安裝的什麽作業系統,用的那種顯卡等等。Windows當機、藍屏和緩慢等等時候,使用者往往會抱怨微軟和Intel,而不是品牌廠商。

ARM體系由最後品牌廠商統合整個產品,它負責打通整個產業鏈,並對其中所有部份負責,話語權極強,同時對技術也相對較強。使用者面對的具體品牌的產品,而不是碎片化的各個部份。強勢的如Apple,硬體軟體一起抓,完全組成閉環的鏈條。稍差也如華為等安卓手機,要負責安卓系統在自己手機移植部份(BSP),客戶出了問題並不會找谷歌,而會去找華為。

在X86生態圈十分強勢的微軟,自己負責作業系統開發, 跳過品牌直接服務終端使用者 ,甚至不經允許直接升級作業系統,鬧出不少風波。強勢也帶來了副作用,它要直接面對數千數萬種千奇百怪的硬體產品,如何才能用一個軟體安裝包服務於這麽多種裝置呢? 必須要一個軟體抽象層封裝這些硬體差別!

這就引出了BIOS和UEFI的最主要的功能: 初始化硬體 提供硬體的軟體抽象

  • ARM體系也要初始化具體主機板相關硬體如GPIO和記憶體等,這些一般在BSP中完成。與X86體系不同之處在於這些硬體完全客製化,初始化的時候就 預先 知道有哪些裝置,Solder Down了哪個品牌的哪種記憶體顆粒,到時候就照方抓藥,初始化一大堆寄存器而已。X86系統設定情況在開機時候是不知道的,需要 探測 (Probe)、 Training (記憶體和PCIe)和 列舉 (PCIe等等隨插即用裝置),相對較復雜。
  • BIOS和UEFI提供了整個主機板、包括主機板上外插的裝置的軟體抽象。透過探測、Training和列舉,BIOS就有了系統所有硬體的資訊。它透過幾組詳細定義好的介面,把這些資訊抽象後傳遞給作業系統,這些資訊包括SMBIOS(專欄稍後介紹)、ACPI表(ACPI與UEFI),記憶體對映表(E820或者UEFI執行時)等等。透過這層對映,才能做到做到作業系統完全不改而能夠適配到所有機型和硬體。
  • 在某種程度上來講,BIOS和UEFI是將作業系統BSP部份單獨封裝後下放到主機板或者BIOS提供商來完成。這在過去帶來了巨大的好處,WinXP、Win7現在還可以執行在更新的電腦硬體上,新的硬體只要自己更改一下就行了,相容性是ARM體系所不能比擬的。當然割裂的生態圈也帶來了使用者感受的千差萬別,這也受到廣泛詬病。各自為政也窒息了創新,帶來了同質化。為此,Intel越俎代庖,提出了變形本等等概念;而微軟更直接出了Surface,似乎要與過去的小夥伴爭食。其實這些都是不得已而為之,今後的發展還需要拭目以待。

    arm社群最近為了進入x86的傳統優勢領域,也開始接受uefi,不過一般只在伺服器領域。個別廠商為了支持Windows而在平板等裝置支持uefi,某廠商在手機上也要引入uefi。不過這些只是支流,並且他們並不吧自己叫做BIOS,而叫做Bootloader。

    UEFI帶來的獨特價值

    看過我的UEFI歷史的文章:

    就知道UEFI是為了替代傳統BIOS而誕生。

    這裏說個小插曲,很多同學都奇怪專欄為什麽有時候說BIOS是指傳統BIOS,有時似乎又涵蓋UEFI。實際上,業內人士在UEFI誕生之初,會嚴格區分兩者的區別,如果十幾年之前有人問我是不是做BIOS的,我會認真的否定:「不,我是做UEFI的,thank you very much!」

    如果有人說UEFI BIOS,會被人蔑視:「BIOS就是BIOS,UEFI就是UEFI,怎麽能混為一談呢?」但在現在UEFI已經全面取代傳統BIOS,傳統BIOS已經幾乎絕跡的情況下,業內人士已經放棄吃藥,預設BIOS就是指UEFI。現在如果有人在我說出UEFI來露出癡呆的表情時,我會說:「就是BIOS啦,哈哈哈」

    傳統之強大可見一斑。甚至現在的招聘JD還是說要找「BIOS工程師」。

    人們總是習慣性的對新出現的東西持懷疑和否定的態度,UEFI在啟動時又還是那三個步驟,那麽UEFI一定是提供了某種特別的東西,才能讓傳統的固件工程師改換門庭。它們究竟是什麽呢?

    答案就隱藏在上面一節「BIOS、UEFI的目的」中。UEFI掃除了傳統BIOS割裂的生態,打通了PC固件之間的鴻溝,並提供統一的介面給作業系統,而不關心作業系統是什麽;它能夠更好的完成PC固件的終極目的: 初始化硬體 提供硬體的軟體抽象,和啟動作業系統。 如果說有什麽東西幫助UEFI打敗了傳統BIOS,那這些東西就是: 標準介面、開放統一和開源了

    傳統BIOS來自於IBM,之後就進入戰國時代,激烈的商戰讓介面統一成為了不可能做到的事,只有在面對微軟這個大使用者的時候,才勉強提供了「 相容 」的基於軟中斷的介面。它封閉、神秘和充滿各種不清不楚的預設和祖傳程式碼,在偵錯PCI的ROM時要小心各種rom之間互相踩,各種只有老師傅才知道的神奇「訣竅」。要寫個驅動,讓它在各個BIOS廠商那裏都能跑,簡直成為了一件不可能完成的任務。

    UEFI [1] 由Intel推動,在一開始就將標準公開,拉上了微軟這個PC界的霸主,強勢統一了江湖。在近20年的深耕下,統一了固件啟動階段基礎框架Spec:PI Spec與作業系統的介面Spec:UEFI Spec,並將抽象硬體的原語性Spec: ACPI Spec也拉入這個大家庭,都變成UEFI Forum的一份子。

    現在只要符合UEFI driver model的驅動都可以在各個BIOS上執行,打通了各個BIOS廠商之間的柵欄;與此同時,符合UEFI標準的作業系統都可以流暢的在各種主機板上執行,無論是Windows,還是Linux各種發行版,甚至是Android。實際上,PC生態圈的繁榮,和UEFI的推廣和被廣泛接受是分不開的。

    值得一提的是UEFI內核的大部份程式碼是由Intel的中國工程師開發的。在大家一次次電腦的正常執行後面,有他們辛勤工作背影。他們也為固件的開源和國產化做出了自己的貢獻。程式碼已經全部開源一部份時間了,在GitHub [2]

    UEFI將要向何處去?

    在發展近20年之後,UEFI的程式碼量十分龐大。在Github上有數百萬行!簡直和一個作業系統一樣,提供各種各樣的驅動和lib,包括網路驅動、iscsi這樣的大塊頭,藍芽和WiFi這些小眾驅動。多樣的驅動和Lib,提供了極大的靈活性,使用者可以拼接出強大的BIOS程式,但與此同時,這些龐大的程式碼,各種Lib和driver,讓理解它十分困難。看準了這個機會,以前偏居一隅的Coreboot在躍躍欲試,走出了ChromeOS的疆域,在IoT市場上開始發力,並希望染指伺服器領域。Google又提出LinuxBoot,希望在這個領域能分一杯羹。

    簡單就是美,如何簡化它,如何更好地和開源社群一起愉快的玩耍,是UEFI需要解決的問題。20年之後的現在,UEFI已經變得越來越傳統, 曾經的屠龍騎士變成了惡龍 ,業界呼喚新的方案,Intel也不失時機的提出了ModernFW [3] 的概念。

    在這個變化的時代,挑戰趨勢就意味著被淘汰,就如以前BIOS的霸主Phoenix一樣,作為行業一哥,拒絕變化,終被AMI超越。個人更是要順勢而為,才能事半功倍。未來在哪裏,現在就下斷言為時尚早,但可以預言的是,未來的PC啟動固件,一定會更小,更美,更簡單!

    後記

    最後給大家留個小思考題: 為什麽Intel、AMD這種芯片廠商會這麽關心BIOS標準?它們也不出BIOS啊?

    BIOS培訓雲課堂

    這篇文章我會修改後釋出在我的專欄中:

    並在該文中公布答案,大家也可以在這裏積極留言,好的答案會一並摘錄。

    更多BIOS文章:

    歡迎大家關註本專欄和用微信掃描下方二維碼加入微信公眾號"UEFIBlog",在那裏有最新的文章。

    用微信掃描二維碼加入UEFIBlog公眾號

    參考

    1. ^ UEFI 官網 https://uefi.org/
    2. ^ EDKII https://github.com/tianocore/edk2
    3. ^ ModernFW https://www.phoronix.com/scan.php?page=news_item&px=ModernFW-Exciting