1. 程式人生 > >Legacy和UEFI,MBR和GPT的區別

Legacy和UEFI,MBR和GPT的區別

Legacy和UEFI指的是系統引導方式(Legacy為傳統BIOS,UEFI為新式BIOS),MBR和GPT指的是磁碟分割槽表型別。

一般情況下都是Legacy+MBR, UEFI+GPT這兩種組合。但Legacy+GPT,UEFI+MBR也可以實現。

Legacy用的是8086彙編,UEFI 99%以上用C,UEFI的APP和Drives可以用C/C++。
64位的UEFI韌體是64位的作業系統(少數二合一平板用32位UEFI韌體的可以忽略不計),Legacy是16位的。
Legacy是直接針對底層硬體細節,UEFI通過Firmware-OS Interface、Boot Services、Runtime Services為作業系統和引導器遮蔽了底層硬體的細節。
UEFI可以擴充套件,大多數硬體載入UEFI的驅動模組就可以完成初始化,驅動模組可以放在韌體中,也可以放在裝置上,比如顯示卡的GOP,系統啟動就自動載入。UEFI中的每個Table和Protocol都有版本號,可以平滑升級。開發者可以自己根據規範開發UEFI應用程式和驅動程式。
UEFI基於time的非同步操作,提高了CPU的效率,減少了等待時間。
UEFI捨棄了中斷這種外部裝置操作方式,僅保留了時鐘中斷,操作外部裝置採用事件+非同步操作,啟動的時候按需載入外部裝置。
UEFI有個安全啟動功能,只有當程式的證書被信任才會被執行。

在UEFI模式下啟動,啟動的是EFI驅動和應用程式,而且只要系統一啟動,就直接是64位的了。(少數二合一平板32位的UEFI韌體忽略不計)

那麼如果選擇UEFI模式啟動,所有的16位的MS-DOS實用程式,DOS工具包和其它的維護工具以及32位的應用程式都是無法載入和啟動的。UEFI必須安裝使用64位系統!
所以在UEFI模式下,我們不能引導32位的系統。
但是呢,在Legacy模式下呢,16位的DOS工具包、32位的程式和系統、64位的都可以OK。
本文只討論原生UEFI和原生BIOS。
至於帶有CSM相容模組的UEFI本身就是UEFI+BIOS的結合體,自然全相容沒話說。

至於分割槽表,接下來慢慢說這個事。

硬碟一個邏輯扇區有512個位元組,硬碟的第一個扇區,也就是0磁軌0柱面1扇區,也就是邏輯扇區0,這個扇區就叫做主引導記錄,叫MBR(master boot record)翻譯成中文就叫(明(M)白(B)人(R)),就是你得弄明白了。

MBR記錄了整塊磁碟的重要資訊,是計算機開機後訪問磁碟時所必須要讀取的首個扇區。主要有三個部分:

  1. 主引導分割槽(Master Boot Record,MBR):主要作用是檢查分割槽表是否正確,並且在系統硬體完成自檢以後將控制權交給磁碟上的載入程式(如GNU,GRUB)
  2. 分割槽表(partition table):佔據64個位元組,可以對四個分割槽的資訊進行描述,其中每個分割槽的資訊佔據16個位元組
  3. 結束標誌字:0x55AA,最後兩個位元組,是檢驗主引導記錄是否有效的標誌

注:MBR有兩個意思,根據語境確定指的是第一個扇區還是主引導分割槽。

下面這個圖就是主引導記錄:

載入程式後面4個位元組 1B8-1BB 代表windows磁碟簽名
1BE-1FD 64個位元組是硬碟分割槽表DPT(Disk Partition Table)
最後的兩個位元組 1FE-1FF (即55 AA )是MBR的結束標誌。

明白為什麼MBR分割槽表最多為什麼只能有4個主分割槽了吧?

 

因為每個分割槽資訊需要16個位元組,所以對於採用MBR型分割槽結構的磁碟,最多隻能識別4個主(primary)或擴充套件(extend)分割槽。擴充套件分割槽也是主要分割槽的一種,但它與主分割槽的不同在於理論上可以劃分為無數個邏輯分割槽。

主分割槽和擴充套件分割槽

磁碟中最多可以有4個Primary和Extended的扇區,而Extended只能有一個,如果要把磁碟分割槽成四個分割槽,那麼只能是:

P+P+P+P
或者
P+P+P+E

上面的情況中, 3P+E只有三個主分割槽可用,因為Extended不能被格式化作為資料訪問的分割槽,還需要進一步分割槽成邏輯分割槽。如果要四個都可用,就需要分割槽成4P

擴充套件分割槽中邏輯驅動器的引導記錄是鏈式的。每一個邏輯分割槽都有一個和MBR結構類似的擴充套件引導記錄(EBR),其分割槽表的第一項指向該邏輯分割槽本身的引導扇區,第二項指向下一個邏輯驅動器的EBR,分割槽表第三、第四項沒有用到

需要注意的問題:

  1. 主分割槽和擴充套件分割槽最多隻有四個
  2. 擴充套件分割槽最多隻能有一個
  3. 邏輯分割槽是由擴充套件分割槽持續切割出來的分割槽
  4. 只有主分割槽和邏輯分割槽才能被格式化作為資料訪問的分割槽
  5. Linux系統預設將前4個序號作為主分割槽或擴充套件分割槽,而邏輯分割槽的序號肯定從5開始

下圖來自Inside the Linux boot process,較為清晰的畫出了MBR中各個部分的結構

MBR

 

GPT分割槽表位於磁碟的邏輯扇區第2-33號扇區,一共佔用32個扇區,能夠容納128 (4*32)個分割槽表項。每個分割槽表項大小為128位元組,所以Windows系統允許GPT磁碟建立128個主分割槽。
分割槽表項中記錄著分割槽的起始,結束地址,分割槽型別的GUID,分割槽的名字,分割槽屬性和分割槽GUID。
所以說除了MBR之外首尾還各需要33個扇區。手動分割槽的時候要特別注意尾部留空。

GPT分割槽的第1個扇區,也就是扇區0。

發現什麼了?
GPT也有一個類似於MBR的東西,只不過引導記錄是空的,windows磁碟簽名有,而且分割槽表也有,只不過分割槽格式被定義為了EE,因為這個格式不存在,所以老舊的磁碟分割槽工具開啟這個磁碟就會發現無法識別這個磁碟的格式,進而不會對磁碟進行分割槽操作。

看到這裡,我們就已經明白了,所以說其實分割槽表也就是那麼回事,GPT和MBR只不過是兩種分配硬碟資料的方式而已。
GPT分割槽的0扇區可以寫入主引導記錄,也可以寫入分割槽表,只不過需要手動換算一下。
所以傳統Legacy BIOS啟動GPT的分割槽是完全可行的。
而UEFI呢,本身就是讀取硬碟的第一個FAT32分割槽的\efi\boot\bootx64.efi檔案來引導系統的,那麼無論分割槽格式是MBR還是GPT,都不會影響UEFI的正常引導。
這就是我們能夠成功讓傳統BIOS啟動GPT磁碟的作業系統;讓UEFI啟動MBR磁碟的作業系統的理論基礎。

下面先說說UEFI啟動MBR吧,首先MBR分割槽表一定要有一個FAT32分割槽,是不是活動分割槽無所謂,因為UEFI沒有活動分割槽的說法。
只要手動修復一下FAT32分割槽的BCD檔案就行了,用BOOTICE工具編輯一下就OK了。
如果遇到下圖的錯誤,就是BCD的問題:

只要修復一下BCD就行了。下圖就是UEFI的BIOS啟動的MBR的磁碟
這個很簡單,就不在囉嗦了

傳統Legacy BIOS啟動GPT,這個有點複雜,確實有點複雜……
其實也有幾條技術路線可以選擇的。
首先我們需求就是要傳統Legacy 能啟動gpt分割槽表的大硬碟。這個很繁瑣,技術路線有幾條,首先Legacy是可以讀取主引導記錄的440個位元組,但是讀了以後無法識別分割槽格式,所以說就要做一個映象檔案 裡面包含需要使用的資訊。目前我是直接做的扇區編輯,jmp到特定的扇區,用這個扇區的資訊來引導到目標的,非常繁瑣,這個技術太複雜沒法推廣。

所以我在研究另一種技術路線,就是模擬uefi的方式,這種方式常見於變色龍,三葉草,clover,duet。這個技術路線相對來講就簡單了。如果你有兩塊硬碟,一塊mbr和另一塊gpt,這個就很簡單了,從mbr磁碟啟動,載入模擬uefi,然後再引導gpt磁碟的系統。

可是如果是單一gpt的磁碟,那還是免不了做扇區編輯,前面留空一段空間,然後把映象用16進位制寫進去,再載入到記憶體,然後執行模擬uefi的程式。這就有點複雜,比如說搞電路的,交流變直流 然後整流 降壓 再濾波什麼的,費很大勁就為了一個看起來很簡單的結果。

 

 

參考連結:http://tieba.baidu.com/p/5805120650?pn=1