本帖最後由 阿達金田一 於 2014-9-10 05:42 編輯
大家好...從這裡退役很久了...粉久沒回來了...(不認識我這行可以跳過去)
我都還在用 xp 和 nonxpe
win7/8 .. 7/8pe 離我很遠...
技術層面還在 7 8年前....所以我現在算是新手
看有沒有那為神人大另發一篇 詳細說明 uefi 開機流程
若有說錯...請神人用力糾正
因為我說了這只是我的 "感想" ...所以這不是教學文啊
今天回來發個帖只是...因為...突然對 uefi 有點興趣
有興趣是因為抓了 Win8.1 和 vbox 4.3...支援 uefi 開機...所以玩一下
這裡就不說 legacy bios(傳統bios) 和 uefi bios 是啥...大家應該不會比我還菜吧
這裡只是想討論一下 legacy 和 uefi 的 "開機"
不管是 光碟 還是 usb , 網路上雖然有很多 legacy/uefi 雙支援的開機
不過 legacy bios 和 uefi 的 "開機" 到底是啥一回事咧
( legacy bios 大家應該都比較瞭...這就不說太多...不瞭的要去用功一下 )
也許網路有文章吧...(雖然我爬不太到)
我爬到的...最多也只是說一下怎麼做而以...一些基礎都還是不太瞭
在我自己亂搞後...以下是自己的心得感想
雖然不想把 legacy bios 拿出來說...但要說 uefi 還是要拿來比較一下
legacy bios 和 uefi bios 可以想成是不同的 "電腦硬體 管理控制 基礎系統"
(就像 操作系統 也分 linux , windows ... 這裡強調的是 "不同的系統")
所以相對的 "程式"
legacy bios 的程式 和 uefi 的程式...基本上是不互相支援的
因為一個是用 legacy bios 去管理控制...一個是用 uefi bios
不過是 "程式" 本身就有一定的彈性
不能直接支援...那 軟支援 為必不行 (雖然目前沒看到過)
不過個人覺的 legacy bios 要 軟支援 uefi程式...應該比較難
反過來 uefi 要軟支援 leagcy bios 程式 還比較有可能一點
(看有沒有神人寫個 efi程式 去 模擬 或 轉換 而去執行 bios 程式)
不過...這不是我現在要說的重點...所以跳過
以上是只我對 legacy , uefi 2種不同 "硬體系統" 的小看法
我主要想說的只是 "開機"...所以上面那些看看就好
回顧一下 legacy bios 的開機
legacy bios 基本上就是跑去讀 裝置 的 開機區
像 硬碟 就是 第1個 磁區(mbr) 或 光碟的開機引導
基本上是直接對 裝置 的 "位址"...做存取
我個人想法是... legacy bios 原則上不支援 FS (檔案系統)
雖然目前的 legacy bios主機板...都 支援bios 按 熱鍵 直接找檔案 刷新bios
不過我認為那只是在 bios 中內崁 bios程式 (就像 grub4dos 也是 bios程式 也可以讀 FS)
基本的 legacy bios...應該就只是裝置 "位址" 的直接存取
只是 legacy bios 的成熟(被人摸熟到快爛)
所以 legacy bios 的程式也很成熟
legacy bios的開機管理程式就不說了...一大堆
grub4dos 算是只要有在摸都應該會知道的
上面是說 legacy bios
那 uefi bios 給我的感覺就是 ... 支援 FS 的 bios
當然支援哪一種 FS 也是要看
而 uefi 開機我感覺就只是...到 FS 下載入開機檔 (固定位置的 efi程式)
例如
32bit uefi 就是讀取 \efi\boot\bootia32.efi
64bit uefi 好像是讀取 \efi\boot\bootx64.efi
所以我在想...不知道以後 grub4dos 會不會出 grub4efi(grldr.efi)
手邊沒硬體環境的 (例如...敝人我就沒硬環境)
可以去用 vbox 4.3
有 uefi...也有 uefi shell
uefi shell 就是一個簡易的 uefi 指令介面
有的主機板不一定有 uefi shell (網路上說的)
可以把 uefi shell 想成類似 grub grub2 grub4dos 那類的 開機管理程式指令介面
vbox 中...設定 uefi 開機
如果並沒有可以開機的 FS ... 會自動進入 uefi shell
如果有可以開機的 FS ... 那就開機了
如果想要不開機...要進入 uefi shell
在開機前按任意鍵...會出現 uefi 管理選單
在 Boot Manager 中選 EFI Internal Shell 就可以進入 uefi shell
另外 Boot Maintenance Manager 中的 Boot From File
可以直接指定用 FS 中的 efi 啟動
這是只是 vbox 的方式...實體PC 請看主機板說明書啊
主機板沒 uefi shell ???...網路上是有說可以用 U盤(隨身碟)啥的
所以我覺的 uefi shell 也只是一個 efi 程式而以
不過 載入 uefi shell ...這個我沒研究
但是應該就只是把 uefi shell 的 .efi
放到 \efi\boot\bootia32.efi 或 \efi\boot\bootx64.efi (看是用 uefi shell x86 還是 x64)
然後用 uefi 開機
或是用 uefi 的管理選單直接指定 uefi shell 的 .efi 載入
(像 vbox 的 Boot From File)
這樣來說...用光碟應該也可以載入 uefi shell...不一定要U盤
進入 uefi shell 後...可以看到 mapping table (我英文爛不會翻譯)
uefi 支援的 FS...會以 FS0: FS1: FS2: 表示
反過來說用 FSx: 表示是...應該都是可以拿來開機 的 FS (當然要有 開機檔 才開的起來)
BLKx: 這個我就不太瞭...應該就是 FS 的反過來吧
可能是指 不是FS (應該是裝置...拿 grub4dos 來說就像是 hdx , FS 像 hdx,x)
或是 不支援的FS
輸入 help 可以看到 uefi shell 的指令說明(英文我也看不太懂)
如果想在看一下 mapping table
輸入 map
像是用 win 8.1 pro x86 的光碟
他是 bios/uefi 雙支援的 udf開機光碟 (2個開機引導 1個 legacy bios 1個 uefi)
uefi 的開機引導...其實也是 1.4M 的 軟碟映像檔
映像檔中其實也就是 \efi\boot\bootia32.efi ( 猜測 x64 的大概就變成 bootx64.efi )
uefi 開機引導映像檔...在光碟中 \efi\microsoft\boot\efisys.bin 找的到
在 uefi shell 中...可以看到2個 和 cdrom 有關的 map
大概長成 PciRoot(xxxxxx./.../.../CDROM(0x0) 和 CDROM(0x1)
一個是 FS 一個是 BLK
可以分開輸入 FSx: 和 BLKx: ( x 是數字...看你顯示的是那一個 )
在輸入 Dir 或 ls
FS 那個...可以看到 efi 目錄
可以用 cd efi 進入
cd \efi\boot ..就直接到 \efi\boot
再輸入 bootia32.efi...就會執行 bootia32.efi (光碟的開機檔)
就會顯示 press any key to boot from CD or DVD
都不按...就回到 uefi shell..有按就去載入 \bootmgr.efi (bootmgr efi版)
另外 efisys_noprompt.bin 和 cdboot_noprompt.efi
應該是 "不會提示 press any" 的版本吧 (我沒試)
輸入 BLKx: 到另外一個, 輸入 Dir
可以看到只有一個 README.TXT
可以 type README.TXT ... 可以看到一堆英文 xxxx UDF xxxx
簡單說...就是 vbox 的 uefi 不支援 UDF 啦
說到這..可能有點亂...不過前面那些還是要先說...有點概念才好接著說
上面說一堆 uefi shell 其實只是在說
可以用 uefi shell 看一下電腦上有那些 uefi 可以看到(識別)的 FS
uefi 基本上...支援 FAT
所以一堆 uefi usb 開機都要求用 FAT
而 win8.1 的開機引導也就是一個 FAT 的 IMA
(裡面放 \efi\boot\bootia32.efi)
當然隨著 uefi 更新和成熟...以後可能可以支援更多 FS
像是目前好像有的 uefi 可以支援 NTFS
所以網路上就有些文章在說可以把 esp msr 都不要只留一個 NTFS 放 win 8 就好
但那個前提要...uefi 支援 NTFS
反過來說 win 7 8 uefi 要建立 esp分割區(FAT)
其實也只是用來 uefi 開機...放 uefi 的開機檔
另外一提...因為 win7 8的 install.wim 都大過 2G 所以光碟是用 UDF 格式
而如果 uefi 可以支援 UDF
那...開機本身沒有 開機引導 ... 一樣可以 uefi 開機
(說穿了..那個引導只是生出一個 FAT 的 FS 給 uefi 開機用的)
不過 uefi...目前是不支援 UDF
好吧...我沒實機環境玩...不過 vbox uefi 是不支援UDF的
但是... vbox uefi 支援 iso9660
是不是 uefi 原本就支援 iso9660 我不清楚
網路上我爬不到資料(好吧我是沒太認真爬的)
不過 vbox uefi 支援 iso9660 就是了
我測試時做了一個 沒開機引導的 iso...還是可以 uefi 開機
不過說到 FS...所以提一下 FS 和 HD分割 的關係
HD -> 分割(MBR 或 GPT) -> 分割區(格式化成 FS)
照上面那 uefi 支援 FS 前...要先支援 分割表 啊
因此...話說回來...一樣是網路上...有聽說
有些 uefi 不支援 MBR 的 (我是有點懷疑啦)
= = 如果是真的那些 uefi 就只能用 GPT 才能 uefi 開機了
反之...如果 uefi 是支援 MBR (vbox 的 uefi 支援 MBR)
那 uefi 開機就不一定要用 GPT
最後...來總結一下開機流程...不然還是亂亂的
legacy bios
hd >> 開機磁區(MBR引導)...支援分割表 >> 分割區中的開機磁區(引導) 支援FS >> FS中的 legacy bios 開機程式(當然也要支援 分割表 和 FS)
像 grub4dos (支援 MBR GPT , FAT NTFS)
hd >> grub4dos MBR引導(支援mbr) >> grldr
hd >> 一般 MBR引導(支援mbr) >> 分割區 grub4dos 開機引導 >> grldr
ntldr/bootmgr 開機 (支援 MBR,GPT , FAT NTFS)
hd >> 一般 MBR引導(支援mbr) >> 分割區 ntldr/bootmgr開機引導 >> ntldr/bootmgr
( 別懷疑看錯....XP SP2 以後的 ntldr 其實是有支援 GPT...bootmgr 也是有支援 GPT
雖然一般 MBR引導 不支援 GPT 不過可以修改一下 MBR 去引導到 GPT 的分割區
相關可以查一下我自製的工具 BiosGPT Win )
uefi 32/64
hd >> uefi 所支援 FS 中的 \efi\boot\bootia32.efi(或 bootx64.efi)
所以 uefi 的 引導概念很淡
感覺就像是 legacy bios 直接到 grub4dos 了
或者說...legacy bios 前面的開機動作並不是 "檔案" (而是載入 磁區 中的程式) 所以我們都稱為 引導(程式)
但在 uefi 中都是用 檔案 來處理( 分割表 和 FS 支援丟給了 uefi 處理 )...相對彈性很多...開機檔案換掉...開機就改了
而不像 legacy bios...還要用程式去對 引導磁區 做寫入處理
不過實際上...legacy bios 也不一定要去修改 引導磁區...才能換開機...基本上這是2回事
因為 引導 的最終目的就是 載入 開機程式
不同的 引導 只是 載入 開機程式的檔案 和 流程不同 (前面流程就寫了)
像 grub4dos 的 MBR 引導...就是直接搜尋 分割區中有沒有grldr可以載入
而 grub4dos 分割區引導就是載入 grldr
而其實上只是要載入 grldr ...用 ntldr/bootmgr 的流程和引導 也是可以...把 grldr 取代 ntldr/bootmgr 就好了
而 uefi shell 之類的 efi 程式...一定程度上就類似是 grub4dos
(只是 uefi shell 目前比較陽春了...可能是我不會用)
只不過目前比較多人知道的 開機管理的 efi 好像也不多
我也只知道 grub2 (或著說 grub2 有 efi 版的)
uefi 開機...主要就是 FS 的支援
MBR GPT FAT32 NTFS 等等...
(覺的回到 usb開機...初期那種常常這個不支援那個不支援的時代..通通用FAT16 DOS)
不過最保險通用...應該是
GPT + FAT
註明一下...這裡說的都只是 uefi 開機而以..沒扯到 OS
其實像 windows 的 uefi 開機
可以看一下 BCD...執行的也不是 winload.exe 而是 winload.efi
也就是 winload.exe 的 efi 版
另外 OS 本身 uefi 開機有沒有支援 MBR ... 還是只要 uefi 有支援就都 ok ?
又或者...
就算 uefi 不支援 MBR...但有辦法載入 bootmgr.efi
那 bootmgr.efi 有支援 MBR 就可以了 ?
我覺的這扯到 efi程式 怎麼寫
不過我不太瞭 uefi efi 所以...下面是隨便亂說的
像就 legacy bios 時...bios 是不支援 FS...但透過 legacy bios 程式 去支援
從某個角度來說就是 位址 <-> legacy bios程式 之間的轉換
我們在 legacy bios程式 看到的是 FS 和 File
但 legacy bios程式在透過 bios 去存取時應該還是 位址 (該檔案所在的位址)
而 uefi 本身支援 FS 的話
那是不是 efi程式 比較懶的...直接用 uefi 支援的 FS...本身卻不帶自行支援的程序
-----分割線-----
因為我是邊打邊玩 uefi (所以文章中可能亂亂...中間可能就突入新的測試感想)
本來到 分割線 就完了...不過補充一下剛才才玩完的
這裡要提一下 efisys.bin(也就是efi開機的引導映像檔)中的 bootia32.efi
其實是 cdboot.efi
在 windows 中...對該檔按 內容->版本...就可以看到資料(內部名稱)
而實際上 "光碟"中的 \efi\boot\bootia32.efi 是 bootmgr.efi
但和光碟中 \bootmgr.efi 並不一樣
光碟中的 \boormgr.efi 是給 efisys.bin 中的 bootia32.efi(cdboot.efi) 用的
它無法在 uefi shell 中直接載入啟動 ( 好吧..是我不會 )
\efi\boot\bootia32.efi 則可以在 uefi shell 中直接執行 應該是給 硬碟用的
(或是 iso9660 的光碟用的...)
而因為我是用 iso9660 和 udf 2種在玩
發現 cdboot.efi 主要其實就是給 udf光碟 在用
cdboot.efi 會去載入 udf 中的 bootmgr.efi
我光碟改 iso9660 ... cdboot.efi 就會載入不到 bootmgr.efi 而回到 shell
而 cdboot.efi 也不能去啟動 "光碟中的 \efi\boot\bootia32.efi"
我試著 udf 格式...把原本的 \bootmgr.efi 用 \efi\boot\bootia32.efi 取代
結果 cdboot.efi 完...也是回到 shell
總之 cdboot.efi 只能啟動 \bootmgr.efi
而且好像只支援 光碟udf 的 (硬碟就不知道了)
感覺就是 cdboot.efi 就是針對 udf 的對應解決方式
從這點來看...其實 uefi 就算不支援 UDF NTFS
還是可以透過 efi 程式 (就像 grub4dos) 一樣去軟支援...從而載入
這也是正常的..不然win的 esp 怎麼去啟動 ntfs 中的 winload.efi
還不是經由 esp 中的 efi版的 bootmgr...去啟動 ntfs 中的 winload.efi
在猜想搞不好 uefi 原裝就只支援 FAT/FAT32
甚至不支援...都只是由 efi程序去支援, 就像 legacy bios 和grub4dos 之間的關係
而PC上的 uefi bios 管理介面...搞不好一樣也是 efi程序 而以
就像我前面提到 "bios 按熱鍵直接找檔案刷新bios...可能也是內崁的bios程序"
有異曲同工之妙
那所謂支援 NTFS 的 uefi...搞不好也只是通過 efi程式 軟支援
然後該 efi程序會去跑 \efi\boot\bootxxxx.efi
所以...目前比較期待強大的 efi開機管理程式...(就像 legacy bios中的grub4dos)
或者是 軟模擬bios...從而執行 bios程式
|