1. 程式人生 > 其它 >Mac 系統引導過程概述 & BootCamp

Mac 系統引導過程概述 & BootCamp

前言

OS X 與 Windows 在引導流程上有很大的差別,而且在 Mac 上執行 Windows 需要經過特殊的處理。造成這種差異的原因在於磁碟分割槽表格式。

分割槽表

一個磁碟拋開物理組成部分的話,它就是一個地址序列,這個序列從 0~n-1 ,每個地址包含 512B(位元組)的空間。一般我們將這些地址稱作邏輯塊地址(LBA),每塊由 512B 組成。分割槽表告訴作業系統,磁碟的分割槽有幾個,從哪裡開始到哪裡結束。當將一個磁碟插入已經含有作業系統的機器上時,作業系統會檢索這個磁碟的分割槽表,並正確認識它的分割槽結構。一個磁碟是先有分割槽表,後有分割槽,然後才有檔案系統,有了檔案系統才能被作業系統讀寫刪。


分割槽表格式與系統引導的關係

磁碟分割槽表格式目前主要有兩種,分別是 MBR 分割槽表 和 GUID 分割槽表,兩種分割槽表的主要區別在支援的分割槽數量上。前者僅支援4個主要分割槽,後者則可以擴充套件到超過128個。

MBR,即 Master Boot Record ,位置在磁碟的第一個邏輯扇區,即 LBA0 的位置。一個邏輯扇區僅有 512B(位元組) ,而且分給 MBR 分割槽表 的只有 64B ,每個分割槽佔分區表的 16B ,剩下的位元組由 MBR 引導程式碼和其它組成。因為每個分割槽只有 16B 大小的分割槽表記錄,所以定址最大隻能到 2.2TB 。下圖的綠色部分

PBR,即 Partition Boot Record ,位置在每個磁碟分割槽的開始部分,佔用扇區不定。這個扇區一般儲存著作業系統載入程式的所在位置。下圖的紅色部分。

檔案系統,File System ,作業系統對磁碟的所有操作都需要經過檔案系統,刪除檔案指的是在檔案系統裡刪除檔案的索引條目,建立檔案就是在在檔案系統裡新增索引條目並將具體資料寫入磁碟。常見的檔案系統格式有: FAT exFAT NTFS HFS+ 。檔案系統位置一般在PBR之後。下圖黃色部分

傳統的 BIOS 引導作業系統過程如下圖:

計算機器開機後,固化在 ROM 裡的 BIOS 就會被載入到記憶體執行,BIOS 自檢完畢以後載入 COMS 的引數,通過 COMS 的引數, BIOS 程式載入啟動磁碟的 MBR 到記憶體裡執行。通過執行 MBR 的程式碼,記錄在 MBR 分割槽表中,標記為活動分割槽的磁碟分割槽 PBR 被載入到記憶體。與 MBR 類似,PBR 在執行後加載作業系統的載入程式到記憶體執行,例如 Windows 的 bootmgr 。當載入程式執行後作業系統核心就被載入執行,完成從 BIOS 程式中接手的引導流程。

傳統的 BIOS 比較低階,它不能像作業系統一樣識別檔案系統,所以磁碟必須要有一個固定的物理塊作為引導塊(Boot Block),這個引導塊就是 MBR 。

GPT,即 Globally Unique Identifier Table ,全域性唯一標識碼分割槽表,簡稱 GPT 或 GUID 分割槽表(下面將混用這兩個稱呼)。由於 MBR 分割槽表 的侷限性(還有 BIOS 的),GPT 誕生了。GPT 由 GPT 頭和 GPT 主體,GPT 備份 組成。起始於磁碟 LBA1的位置,相對的 LBA0 仍然為 MBR ,但是這個 MBR 是被保護的,沒有引導程式碼,僅僅有一個被標識為未知的分割槽,當支援 GPT 分割槽表的作業系統檢索到這個 MBR 後就會自動忽略並跳到 LBA1 讀取 GPT 分割槽表。如下圖,由於篇幅的關係,表的長度比例不等同與實際在磁碟地址裡的實際比例。

EFI,是一種取代傳統 BIOS 的一種技術。如果將 BIOS 比作是一個程式的話,那麼 EFI 就是一個簡化的作業系統。比起傳統的 BIOS ,EFI BIOS 有更多的擴充套件性。下圖介紹 EFI 引導作業系統的流程。

EFI 系統啟動後,GUID 分割槽表就會被識別,之後 EFI 系統就啟動 Boot Loader 程式載入作業系統核心。對於分割槽表格式為 MBR 分割槽表 的磁碟,EFI 系統會 先啟動 CSM 相容模式後按傳統 BIOS 的步驟載入作業系統的核心。如下圖。

一般的 EFI 系統僅能識別 FAT32 ,不同於 BIOS 只能識別固定位置的磁碟引導塊。這意味著只要將載入程式放到 FAT32 分割槽裡,EFI 系統就能通過分割槽表的指引找到這個儲存著載入程式的 FAT32 分割槽。

EFI 系統是由模組化的 C 語言程式寫出來的,所以通過新增或修改程式模組就能獲得更多的功能。例如支援更多的檔案系統,圖形介面,甚至能使用瀏覽器瀏覽網頁。
OS X 的磁碟分割槽結構

Mac 很早前就使用了 EFI ,因此在引導上與上文提到的 EFI 引導方式類似。另外,Mac 是使用 GUID 分割槽表格式的磁碟。結構如下圖:

OS X 是不需要 PBR 的,引導是直接從啟動分割槽裡找到載入程式載入核心。

Boot Camp 引導

自從 Mac 使用 x86 架構以後,在其上面執行 Windows 已經成為了可能。蘋果在 Mac 上開發了一種引導 Windows 的技術,叫做 Boot Camp 。

在探討 Boot Camp 之前,混合分割槽表格式需要引起關注。在我們較早前的討論裡得知,Windows 和 OS X 是分別使用兩種引導方式的,前者基於傳統 BIOS ,後者基於 EFI ,不幸的是 BIOS 是無法引導GPT 磁盤裡的作業系統的。為了解決這個問題,混合分割槽表的概念產生了。

GPT 磁碟保留了一個 Protect MBR ,在一般情況下這個 MBR 是空白的。Mac 開機後 EFI 系統直接跳過 MBR 讀取 GPT 分割槽表。假如我們在這個 Protect MBR 上寫入分割槽表和引導程式碼後會怎樣呢?當 EFI 檢索到這個磁碟後會載入那個分割槽表?

帶著上面的兩個問題,我們來探討一下。EFI 是一個簡化的作業系統,那麼可以通過載入一些特別的程式讓它只讀 GPT 分割槽表是可能的。同樣,讓它只讀 MBR 分割槽表也是可能的。這就是 BootCamp 程式的真面目。

建立混合分割槽非常簡單,使用 OS X 的 Boot Camp 助理安裝 Windows 時自動產生。這時 GUID 分割槽表起始的4個分割槽就複製到 MBR 分割槽表。不使用 Boot Camp 助理也是可以手動建立的,通過磁碟工具在 GPT 磁碟上建立一個 FAT32 或 exFAT 分割槽後,系統自動地將 GUID 分割槽表的內容複製到 MBR 分割槽表。

EFI 系統通過載入 Nvram 的引數來決定是否啟動 BootCamp程式。啟動過程如下圖:

雙系統磁碟分割槽結構

BootCamp 首先載入磁碟上的 MBR 到記憶體並執行,這時標記為活動的 BootCamp 分割槽 PBR 被找到,接著載入 bootmgr 後引導 Windows。值得注意的是,GPT 保護分割槽包含了整個 GPT 頭 和 GPT 主體和第一個 EFI 系統分割槽。


注意事項

MBR 分割槽表只支援4個主要分割槽,如果按照一般的情況來安裝 Windows 的話是不能再新增一個分割槽的。如果不幸對這個磁碟進行了分割槽,根據分割槽的方式會出現如下情況:

安裝 Windows 時或後將 GPT 保護分割槽格式化
GPT 保護分割槽包含從 LBA1~LBA409639的所有資料,其中 GPT 頭 和 GPT 主體部分都在這裡。格式化這個分割槽意味著磁碟從混合分割槽表格式變為 MBR 分割槽表格式。儘管兩個系統都還能繼續啟動,但對於 OS X 來說是災難,首先磁碟無法進行動態分割槽,無法用 Boot Camp 助理移除 WIndows ,無法更新 OS X 等等。

安裝 Windows 後在 OS X 裡新增一個分割槽
這種做法對於 Windows 來說是一個災難,當在 OS X 裡新增一個分割槽後,GPT 分割槽表會跟 MBR 分割槽表同步,這時 GPT 已經有5個分割槽了,第5個剛好是 BootCamp ,所以 MBR 分割槽表自動將 BootCamp 踢出去,造成 Windows 無法引導。

正確的多分割槽安裝方法必須要在安裝 OS X 前做好磁碟分割槽規劃。如下表:

GPT保護分割槽

Windows

共享1

共享2

OS X

Recovery HD

GPT 保護分割槽開始到共享2會被複制到 MBR 分割槽表,剩下的部分 MBR 分割槽表會識別為可用空間,但是無法使用這片可用空間建立任何分割槽。

題外

對於 EFI 啟動的作業系統來說,EFI 提供底層硬體的介面,這樣的好處在於保護硬體,而且讓驅動的更新更方便。

傳統的 BIOS 啟動 Windows 在 BIOS 移交控制權後,Windows 全權掌握硬體服務層。

EFI 主機板上使用相容模式 CSM 來啟動的 Windows 也是類似的。

對比起 WIndows 來說,OS X 並不掌握全部的硬體服務,OS X 需要 EFI 系統給出的硬體程式設計接口才能訪問硬體。

BootCamp 啟動的 Windows 則有點特別,與普通 EFI 主機板上的相容模式不同,Windows 在訪問硬體需要經過 EFI 系統。這樣做的作用就是 EFI 全權控制著 WIndows 的硬體訪問能力,只要蘋果有意,完全可以在驅動上限制 Windows 。

Boot Camp 引導的原理來看,要在 Mac 上實現單獨安裝 Windows 是非常簡單的。Boot Camp 程式是固化在 EFI 系統裡的,所以通過簡單設定一下 Nvram 的變數,就可以引導 Windows,無需混合分割槽表格式。修改 Nvram 變數需要通過執行在 WIndows 下的 BootCamp 程式,這意味著,只要裝好了蘋果提供的 BootCamp 驅動,你的 Windows 就能執行在 Mac 上。更有甚者在第二塊磁碟上安裝一個完全獨立的 Windows ,而且是基於純淨的 MBR 分割槽表上安裝,這樣可以忽略掉與 OS X 共享一個磁碟又不能多分割槽的尷尬。

儘管在 Mac 上單獨裝 Windows 也是很簡單的,但 Mac 本身的 EFI 版本比較低,比很多 PC 主機板的還低,所以一些較舊的型號甚至連 U 盤也不識別。這種舊型號的機器想要用上 Windows 得將磁碟拆下接到其它機器上裝好系統再裝回 Mac 。