歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> 更多Linux

用於 Linux 的開放 BIOS開源項目介紹

  在很多系統上,引導時間中有很大一部分都花費在為 MS-DOS 提供傳統支持上面了。有很多項目,包括 LinuxBIOS 和 Open Firmware,都試圖使用最新的代碼來替換原有的 BIOS 系統,它們只實現加載並運行 Linux 內核所必需的功能。本文對這個領域的內容簡要進行了介紹。

  響鈴!

  盡管在 PC 硬件加電時喇叭響一下看起來似乎是件非常自然的事情,但實際上卻有一些代碼來驅動喇叭發聲。這段代碼就是引導固件。在大部分 PC 上,這都稱為 BIOS(這個單詞是 basic input/output system(基本輸入/輸出系統)的縮寫)。BIOS 提供了底層的硬件支持,早期的 x86 操作系統就是使用它們來訪問磁盤、顯示器和其他東西的。

  BIOS 要做的第一件事情是執行各種加電測試:確定(還可能要測試)可用內存、確定時鐘速度等。如果測試成功,機器的喇叭就會響一聲。這個過程就稱為加電測試(power-on self test)或 POST.計算機對於自己是相當幽默的,這個術語通常會被當作動詞來使用:“這台機器根本通不過 POST 測試,因此我們應該更換內存”。

  通常的診斷包括響鈴代碼(不同供應商提供的代碼都不相同),或者可以寫入到某個特定裸地址的代碼。有些後插的卡可以簡單地訪問這些代碼;標准的解決方案是診斷代碼都寫到 80 端口中。有些制造商會銷售一種卡,它可以以 16 進制的形式顯示最新寫入到 80 端口的內容。如果我們要進行嚴格調試,可能就會希望有一個這種卡,或者希望使用一個更好的發明,例如 PC Weasel,它可以記錄最新的(256)POST 代碼以供大家閱讀。(有關 PC Weasel 的更多信息請參看下面的 參考資料 一節的內容。)當然,這些代碼的確切含義對於各個 BIOS 來說不盡相同,只有部分供應商提供了文檔。幸運的是,開源供應商提供了很好的文檔。

  BIOS 還為我們實現了哪些功能?

  諸如 MS-DOS 之類的操作系統可以加載其他設備驅動程序,例如 CD-ROM 驅動器,但是需要所有硬件驅動程序在啟動時就已經加載上來了。為這些驅動程序提供的標准接口是由 BIOS 來處理的,正是由於這個原因,BIOS 需要對設備進行探測、識別,還可能要進行初始化。

  同樣,BIOS 要負責對內存進行初始化。並非所有的操作系統都需要對內存進行初始化,但是早期的 DOS 系統通常都需要進行這種操作,即使在今天大部分 BIOS 為了兼容性的目的也需要進行初始化。這個過程自己可能需要很長時間才能完成,很多現代系統允許徹底或部分地將其禁用。同時,BIOS 還會試圖確定系統中有多少內存可用。其他的引導時操作還可能包括對處理器緩存的初始化和啟用,配置雙 CPU,構建有關處理器的信息表,構建連接到系統中的 PCI 設備,甚至運行這些設備提供的引導 ROM,這可以加載其他驅動程序。

  這裡有很多工作需要做。實際上這些工作是如此繁雜,我的某些系統要花一分鐘甚至更長時間才能完成 POST 和後續的驅動程序初始化過程。BIOS 可以執行各種硬件掃描,從而尋找可引導的設備,在某些系統上,BIOS 甚至可以執行通過以太網進行的網絡引導。我的一個系統就會花大約 5 秒鐘的時間來初始化網絡引導參數,即使在禁用了網絡引導功能的情況下也是如此。這可真令人懊惱!

  最後一點(但不是最不重要的一點),BIOS 還需要做相當多的初始化工作。不管您要引導什麼系統,這些工作中的一部分(但並非全部)都會非常有用。為設備分配中斷請求(IRQ)的確是一個非常有用的服務,因為它允許 OS 只獲取一個服務列表並開始運行,而不用對它們進行編程。很多設備都有配置寄存器,BIOS 可以基於系統可寫內存中的設置向其中寫入合理或正確的值。(通常來說,這種內存都稱為 CMOS,盡管它們並非嚴格要求使用這種技術來實現。)

  在 BIOS 完成上面這些功能之後又會發生什麼呢?它會在某個地方(通常是在磁盤上)查找一段代碼,並運行它,這通常會加載一個操作系統。如果操作系統是 DOS,或其他類似的東西,那麼這種設置工作就意味著我們可以很快就有自己的命令提示符了。

 

  雙重努力

  但是對於 Linux、BSD 或 Windows? 來說,操作系統有自己的驅動程序。因此,操作系統可以丟棄連接到系統上的 PCI 設備列表,並開始加載這些設備。BIOS 所做的工作大部分會被忽略掉,操作系統一旦加載 SCSI 驅動程序之後,就會自行掃描 SCSI 總線。BIOS 並沒有做什麼其他工作,僅僅是提供信息而已,並且它所提供的很多信息也都不會被使用。BIOS 實際上需要做的事情是加載第一段代碼(稱為引導加載程序(bootstrap loader)或 bootloader),並讓機器開始運行。

  因此,在負載相當重的機器上,我們需要等待每個設備都被探測兩次。通常,SCSI 控制器的引導 ROM 要花費相當長的時間來掃描設備。更為糟糕的是,在引導 ROM 運行時,其他東西都無法運行。與之不同的是,現代操作系統可以很好地加載 SCSI 驅動程序,發起一個總線重置命令,在檢查設備完成之前就可以繼續加載其他驅動程序,並執行網絡設備的加載。簡而言之,操作系統的掃描要比 BIOS 的掃描速度更快。




  確切的速度差異取決於操作系統。不過我們知道 Linux 的引導時掃描可以非常快。這意味著 BIOS 不僅要花從加電到最後一個內核模塊加載時間的一半在這上面;有時還可能會花費更多時間。當重要性較低的內核模塊(例如聲卡驅動程序)在引導過程最後加載時(此時一些重要的東西,例如 Web 服務器,可能已經加載了),這種現象更加明顯。

  我們希望要的是一種不用等待 BIOS 來做大量有關內核的工作就可以加載內核的方法 —— 這樣可以更快、更好、更可靠地完成引導過程。

  將內核放入閃存中

  如果我們將所有的設備驅動程序從 BIOS 中刪除,顯然有很多問題都需要考慮:BIOS 是否沒有加載所有的設備驅動程序?它怎樣讀取內核?一種簡單的解決方案是使用因忽略維持一個小型內核所需的設備驅動程序而釋放出來的所有空間。這種內核所需要加載的東西就是磁盤的設備驅動程序,其他可加載的模塊都可以保存在磁盤上。然後在內核啟動之後,可以動態加載這些模塊。

  現代 BIOS 閃存芯片使得這個過程令人驚奇地成為了可能。很多系統都有 1 MB 或 2 MB 的閃存給 BIOS 使用。有時候,實際的 BIOS 也就這麼大。另外一些時候,這種芯片也都已經非常便宜了。精簡並壓縮過的內核可以很容易地放入這種空間中,Linux 引導加載程序在構建小型的解壓程序來展開壓縮內核方面有著非常豐富的經驗。

  這種解決方案對於積極參與內核開發的人來說可能沒有什麼好處,但是對於一個希望盡快引導的系統來說,可能會獲益良多。LinuxBIOS 項目就正在開發這樣一個解決方案,這對於服務器和嵌入式用戶來說可能最合適不過了。

  Open Firmware

  不是為 MS-DOS 設計的引導固件的一個主要分支是 Open Firmware.它通常由 Sun 和 Apple 使用,這種引導固件的開放標准設計時很少關注 DOS 風格的系統,它更感興趣的是諸如最初的 Mac OS、Mac OS X 或 Solaris 之類的系統,它期望能夠實現自己的驅動程序的工作。Open Firmware 的一大優點是它是 “一次編寫,隨處運行” 的:使用 Open Firmware 的引導 ROM 的設備只能在具有安插這些設備的總線的 Open Firmware 系統上正常工作。這帶來的一個問題是很少為 x86 PC 設計的設備具有 Open Firmware 引導 ROM.不過,如果我們可以找到一個具有這種引導 ROM 的設備,這就可能是一種很好的選擇了;當然,這需要我們指定自己的硬件平台,並對特定組件進行標准化。

  Open Firmware 對黑客來說可能是界面最為友好的 BIOS 風格控件。盡管它並不像 LinuxBIOS 之類的項目一樣重點關注的是引導速度,但是其速度通常都比傳統的 PC BIOS 快很多,這對於希望對自己機器進行配置的用戶來說顯得尤其友好。

  如果 x86 供應商缺省開始使用 Open Firmware,這個世界將變得更加友好。

  使用免費 BIOS 的其他方法

  即使只是試圖重新實現傳統 BIOS 的基本功能的 BIOS,也通常使得速度更快,實現也更為開放。例如,如果我們知道某個給定系統上沒有需要花費 5 到 10 秒進行探測的設備,就可以調節用來進行設備探測所進行的 BIOS 延時。

  免費的 BIOS 可以實現的一種重要功能是在構建引導加載程序時具有更好的靈活性。例如,OpenBIOS 項目就已經與 LinuxBIOS 聯合起來使用了,它們使用了 LinuxBIOS 的底層代碼,並使用一個 OpenBIOS Forth 內核作為有效內核,從而將一個系統引導到 Open Firmware 中。x86 系統中很多最為困難的工作是構建小型的代碼塊來加載真正的引導加載程序;更靈活的 BIOS 可以完成這種工作,並解決這個問題。

  注意,盡管 LinuxBIOS 的目標主要是為 Linux 設計的,不過它正在用來引導其他系統;例如,在 2002 年末,LinuxBIOS 用戶就成功使用它引導了 windows 2000.盡管擴展兼容性的努力和技術支持正在進行,但是消除系統引導對私有軟件的依賴性依然是非常重要的一個方向。

  還有一些非常專用但卻並不免費的 BIOS 程序。例如,Soekris Engineering 系統就運行了一個名為 comBIOS 的 BIOS,它比常見的 BIOS 更加簡單,尺寸也更小,引導速度也更快。

 

  很多關注,缺少文檔

  當人們與計算機問題展開搏斗時,他們收到的一個最為常見的建議就是應該更新 BIOS.為什麼呢?理論上來說,BIOS 在系統加載之後就不會被真正使用了。然而,實際上 BIOS 所完成的初始化工作都是非常關鍵的。例如,在我使用的一個嵌入式的 x86 系統上,CardBus 控制器無法使用了,這是因為它需要一個 IRQ 進行編程;升級 BIOS 可以修復這個問題。理論上來說,操作系統可能已經開發了特殊的代碼來識別這個 CardBus 控制器的精確模型,並使用一個 IRQ 進行編程;但是主板供應商處於一個更加有利的位置,它們可能向這個 IRQ 中寫入了主板特有的代碼,這樣才能對控制器正確進行編程。



  以我們傳統的經驗來講,開源系統可以更好地修復 bug.然而,在 BIOS 的情況下,情況卻並不如此明顯。畢竟,原始的硬件供應商可能了解通用 BIOS 開發人員所沒有的一些信息。通用免費的 BIOS 軟件需要在很多主板上運行;供應商的情況卻並不相同,它們可以假設不用擔心代碼在不同硬件上運行的問題。

  盡管如此,開源方法也有很多優點。例如,我使用的一個老式 Alpha 系統可以支持 Symbios Logic 的 875 SCSI 控制器芯片。然而,它硬編碼了一個 PCI 供應商/產品 ID 對的列表,其中保存的是已知的支持設備,它只能使用這個列表中的卡;其他卡即使能夠工作,如果不在這個列表中,也不能在這個系統上使用。由於它的 BIOS 不是開源的,這個問題就顯得有些混亂了,我無法對這個表打補丁進行修正;我只好花了 220 美元從一個特殊的供應商那裡購買了一個 SCSI 卡,而不能使用一個等效的銷售價格為 75 美元的卡。

  當有一個主板供應商決定使用一個開源的 BIOS 而不繼續使用主流的商業實現時,將可能會出現一個轉折點。我不知道這是否會真的發生,什麼時候發生,但是看到一個 BIOS 能夠獲得更好的支持並提供豐富的文檔將是件非常好的事情。

  結束語

  對於大部分用戶來說,這有些不切實際。燒壞 BIOS 芯片的危險依然相當高:在重新燒制 BIOS 之前,計算機根本就無法工作了,由於計算機並不能引導以刷新芯片,因此我們必須采用一些特殊的硬件來實現這種功能。有些系統具有兩個閃存芯片,這讓我們可以使用其中一個來引導系統,然後對另外一個進行編程,但是並非所有的系統都有這種功能。因此,對於大部分用戶來說,試驗其他 BIOS 設計可能有些冒險。不過,如果您自己找到一台空閒的舊式機器,又願意冒險來試驗一下,又有一個免費的 BIOS 項目可以支持這種系統,那麼體驗一下將會非常有趣。興趣將使您愛上它。

  對於從事服務器或嵌入式系統工作的人來說,他們更可能從這種技術中獲益。如果重新啟動系統的時間對於您來說非常重要,那麼您就會有很大的動力來花一些時間和精力讓這種類似技術在您使用的系統上可以運行。另外,如果您沒有做一件瘋狂且毫無技術支持的事情,那麼去做嵌入式開發項目對您來說可能就沒有任何樂趣。

  最後,這種技術可以為供應商提供更多選擇。嵌入式系統的供應商對於引導固件有更多選擇,這可以幫助我們遠離少量的專有 BIOS 設計,進入更加開放和相互競爭的市場。



  結束語

  對於大部分用戶來說,這有些不切實際。燒壞 BIOS 芯片的危險依然相當高:在重新燒制 BIOS 之前,計算機根本就無法工作了,由於計算機並不能引導以刷新芯片,因此我們必須采用一些特殊的硬件來實現這種功能。有些系統具有兩個閃存芯片,這讓我們可以使用其中一個來引導系統,然後對另外一個進行編程,但是並非所有的系統都有這種功能。因此,對於大部分用戶來說,試驗其他 BIOS 設計可能有些冒險。不過,如果您自己找到一台空閒的舊式機器,又願意冒險來試驗一下,又有一個免費的 BIOS 項目可以支持這種系統,那麼體驗一下將會非常有趣。興趣將使您愛上它。

  對於從事服務器或嵌入式系統工作的人來說,他們更可能從這種技術中獲益。如果重新啟動系統的時間對於您來說非常重要,那麼您就會有很大的動力來花一些時間和精力讓這種類似技術在您使用的系統上可以運行。另外,如果您沒有做一件瘋狂且毫無技術支持的事情,那麼去做嵌入式開發項目對您來說可能就沒有任何樂趣。

  最後,這種技術可以為供應商提供更多選擇。嵌入式系統的供應商對於引導固件有更多選擇,這可以幫助我們遠離少量的專有 BIOS 設計,進入更加開放和相互競爭的市場。



Copyright © Linux教程網 All Rights Reserved