天天看點

BIOS與UEFI

BIOS 搭配 MBR/GPT 的開機流程

 CMOS 是記錄各項硬體參數且嵌入在主機闆上面的儲存器,BIOS 則是一個寫入到主機闆上的一個韌體(再次說明, 韌體就是寫入到硬體上的一個軟體程式)。這個 BIOS 就是在開機的時候,計算機系統會主動執行的第一個程式了!接下來 BIOS 會去分析計算機裡面有哪些儲存裝置,我們以硬碟為例,BIOS 會依據使用者的設定去取得能夠開機的硬碟, 并且到該硬碟裡面去讀取第一個扇區的 MBR 位置。MBR 這個僅有 446 bytes 的硬碟容量裡面會放置最基本的開機管理程式, 此時 BIOS 就功成圓滿,而接下來就是 MBR 内的開機管理程式的工作了。

這個開機管理程式的目的是在加載(load)核心檔案, 由于開機管理程式是作業系統在安裝的時候所提供的,是以他會認識硬碟内的檔案系統格式,是以就能夠讀取核心檔案, 然後接下來就是核心檔案的工作,開機管理程式與 BIOS 也功成圓滿,将之後的工作就交給大家所知道的作業系統啦!

簡單的說,整個開機流程到作業系統之前的動作應該是這樣的:

  1. BIOS:開機主動執行的韌體,會認識第一個可開機的裝置;
  2. MBR:第一個可開機裝置的第一個扇區内的主要啟動記錄區塊,内含開機管理程式;
  3. 開機管理程式(boot loader):一支可讀取核心檔案來執行的軟體;
  4. 核心檔案:開始作業系統的功能...

第二點要注意,如果你的分區表為 GPT 格式的話,那麼 BIOS 也能夠從 LBA0 的 MBR 相容區塊讀取第一階段的開機管理程式代碼, 如果你的開機管理程式能夠認識 GPT 的話,那麼使用 BIOS 同樣可以讀取到正确的作業系統核心喔!換句話說, 如果開機管理程式不懂 GPT ,例如 Windows XP 的環境,那自然就無法讀取核心檔案,開機就失敗了!

注意:由于 LBA0 僅提供第一階段的開機管理程式代碼,是以如果你使用類似 grub 的開機管理程式的話,那麼就得要額外分區出一個『 BIOS boot 』的分區槽, 這個分區槽才能夠放置其他開機過程所需的程式代碼!在 CentOS 當中,這個分區槽通常占用 2MB 左右而已。

由上面的說明我們會知道,BIOS 與 MBR 都是硬體本身會支援的功能,至于 Boot loader 則是作業系統安裝在 MBR 上面的一套軟體了。由于 MBR 僅有 446 bytes 而已,是以這個開機管理程式是非常小而美的。 這個 boot loader 的主要任務有底下這些項目:

  • 提供選單:使用者可以選擇不同的開機項目,這也是多重引導的重要功能!
  • 載入核心檔案:直接指向可開機的程式區段來開始作業系統;
  • 轉交其他 loader:将開機管理功能轉交給其他 loader 負責。

上面前兩點還容易了解,但是第三點很有趣喔!那表示你的計算機系統裡面可能具有兩個以上的開機管理程式呢! 有可能嗎?我們的硬碟不是隻有一個 MBR 而已?是沒錯啦!但是開機管理程式除了可以安裝在 MBR 之外, 還可以安裝在每個分區槽的啟動扇區(boot sector)喔!瞎密?分區槽還有各别的啟動扇區喔? 沒錯啊!這個特色才能造就『多重引導』的功能啊!

我們舉一個例子來說,假設你的個人計算機隻有一個硬碟,裡面切成四個分區槽,其中第一、二分區槽分别安裝了 Windows 及 Linux, 你要如何在開機的時候選擇用 Windows 還是 Linux 開機呢?假設MBR 内安裝的是可同時認識Windows/Linux 作業系統的開機管理程式,那麼整個流程可以圖示如下:

BIOS與UEFI

圖 2.2.8、開機管理程式的工作執行示意圖

在上圖中我們可以發現,MBR 的開機管理程式提供兩個選單,選單一(M1)可以直接加載 Windows 的核心檔案來開機; 選單二(M2)則是将開機管理工作交給第二個分區槽的啟動扇區(boot sector)。當使用者在開機的時候選擇選單二時, 那麼整個開機管理工作就會交給第二分區槽的開機管理程式了。當第二個開機管理程式啟動後,該開機管理程式内(上圖中)僅有一個開機選單,是以就能夠使用 Linux 的核心檔案來開機啰。 這就是多重引導的工作情況啦!我們将上圖作個總結:

  • 每個分區槽都擁有自己的啟動扇區(boot sector)
  • 圖中的系統槽為第一及第二分區槽,
  • 實際可開機的核心檔案是放置到各分區槽内的!
  • loader 隻會認識自己的系統槽内的可開機核心檔案,以及其他 loader 而已;
  • loader 可直接指向或者是間接将管理權轉交給另一個管理程式。

那現在請你想一想,為什麼人家常常說:『如果要安裝多重引導,最好先安裝 Windows 再安裝 Linux』呢?這是因為:

  • Linux 在安裝的時候,你可以選擇将開機管理程式安裝在 MBR 或各别分區槽的啟動扇區, 而且 Linux 的loader 可以手動設定選單(就是上圖的 M1, M2...),是以你可以在 Linux 的 boot loader 裡面加入 Windows 開機的選項;
  • Windows 在安裝的時候,他的安裝程式會主動的覆寫掉 MBR 以及自己所在分區槽的啟動扇區,你沒有選擇的機會, 而且他沒有讓我們自己選擇選單的功能。

是以,如果先安裝 Linux 再安裝Windows 的話,那 MBR 的開機管理程式就隻會有 Windows 的項目, 而不會有 Linux 的項目 (因為原本在 MBR 内的 Linux 的開機管理程式就會被覆寫掉)。 那需要重新安裝 Linux 一次嗎?當然不需要,你隻要用盡各種方法來處理 MBR 的内容即可。 例如利用 Linux 的救援模式來挽救 MBR 啊!

UEFI BIOS 搭配 GPT 開機的流程

我們現在知道 GPT 可以提供到 64bit 的尋址,然後也能夠使用較大的區塊來處理開機管理程式。但是 BIOS 其實不懂 GPT  耶!還得要透過 GPT  提供相容模式才能夠讀寫這個磁盤裝置~而且 BIOS 僅為 16 位的程式,在與現階段新的作業系統接軌方面有點弱掉了! 為了解決這個問題,是以就有了 UEFI (Unified Extensible Firmware Interface) 這個統一可延伸韌體界面的産生。

UEFI 主要是想要取代 BIOS 這個韌體界面,是以我們也稱 UEFI 為 UEFI BIOS 就是了。UEFI 使用 C 程式語言,比起使用彙編語言的傳統 BIOS 要更容易開發!也因為使用 C  語言來撰寫,是以如果開發者夠厲害,甚至可以在 UEFI 開機階段就讓該系統了解 TCP/IP 而直接上網! 根本不需要進入作業系統耶!這讓小型系統的開發充滿各式各樣的可能性!

基本上,傳統 BIOS 與 UEFI 的差異可以用 T 客幫雜志彙整的表格來說明:

比較項目 傳統 BIOS UEFI
使用程式語言 彙編語言 C 語言
硬體資源控制

使用中斷 (IRQ) 管理不可變的記憶體存取

不可變得輸入/輸出存取

使用驅動程式與協定
處理器運作環境 16 位 CPU 保護模式
擴充方式 透過 IRQ 連結 直接加載驅動程式
第三方廠商支援 較差 較佳且可支援多平台
圖形化能力 較佳
内建簡化作業系統前環境 不支援 支援

從上頭我們可以發現,與傳統的 BIOS 不同,UEFI 簡直就像是一個低階的作業系統~甚至于連主機闆上面的硬體資源的管理, 也跟作業系統相當類似,隻需要加載驅動程式即可控制操作。同時由于程控得宜,一般來說,使用 UEFI 接口的主機,在開機的速度上要比 BIOS  來的快上許多! 是以很多人都覺得 UEFI 似乎可以發展成為一個很有用的作業系統耶~不過,關于這個,你無須擔心未來除了 Linux 之外,還得要增加學一個 UEFI 的作業系統啦!為啥呢?

UEFI 當初在發展的時候,就制定一些控制在裡頭,包括硬體資源的管理使用輪詢 (polling) 的方式來管理,與 BIOS 直接了解 CPU 以中斷的方式來管理比較,這種 polling 的效率是稍微慢一些的, 另外,UEFI 并不能提供完整的快取功能,是以執行效率也沒有辦法提升。不過由于加載所有的 UEFI 驅動程式之後, 系統會開啟一個類似作業系統的 shell  環境,使用者可以此環境中執行任意的 UEFI 應用程式,而且效果比 MSDOS 更好哩。

是以啰,因為效果華麗但效能不佳,是以這個 UEFI 大多用來作為啟動作業系統之前的硬體檢測、開機管理、軟體設定等目的,基本上是比較難的。 同時,當加載作業系統後,一般來說,UEFI 就會停止工作,并将系統交給作業系統,這與早期的 BIOS 差異不大。比較特别的是,某些特定的環境下, 這些 UEFI 程式是可以部份繼續執行的,以協助某些作業系統無法找到特定裝置時,該裝置還是可以持續運作。

繼續閱讀