UEFI
統一可擴展固件接口(Unified Extensible Firmware Interface,簡稱 UEFI,EFI 的後繼者)是作業系統和固件之間的接口。UEFI 提供了啟動作業系統或運行預啟動程序的標準環境。
UEFI 有別於傳統 BIOS 系統所使用的「MBR 引導代碼」。二者的區別和使用 UEFI 啟動的過程見 Arch 的啟動流程。要配置 UEFI 引導加載程序,請參見 Arch 的啟動流程#引導加載程序。
UEFI 版本[編輯 | 編輯原始碼]
- 1.x 版本的 UEFI 起始於 Intel 的 EFI。
- 後來,一個名為 UEFI Forum 的公司組織接管了其開發工作,他們從 2.0 版本起將其更名為 Unified EFI。
- 除非特別指明是 EFI 1.x,EFI 和 UEFI 均指代 UEFI 2.x 固件。
- Apple 的 EFI 實現既不是 EFI 1.x 版本也不是 UEFI 2.x 版本,而是這兩者的混合體。這類固件不被歸入到任何 (U)EFI 規格中,因而不是標準的 UEFI 固件。除非特別指明,以下説明可通用,但部分內容在 Apple Macs 上可能無效或有所不同。
最新的 UEFI 標準位於 https://uefi.org/specifications 。
UEFI 固件架構[編輯 | 編輯原始碼]
UEFI 下每一個程序,無論它是某個 OS 引導器還是某個內存測試或數據恢復的工具,都要兼容於 EFI 固件位數或體系結構。
目前主流的 UEFI 固件,包括近期的 Apple Macs,都採用了 x86_64 EFI 固件。目前還在用 IA32 即 32 位的 EFI 的已知設備只有於 2008 年前生產的 Apple Macs,一些 Intel Cloverfield 超級本和採用 EFI 1.10 固件的 Intel 伺服器主板。
x86_64 EFI 不能兼容 32 位 EFI 程序。所以 UEFI 應用程式必須依固件處理器位數/體系結構編譯而成。
i386-efi
模塊的GRUB。檢查系統位數[編輯 | 編輯原始碼]
Linux 系統[編輯 | 編輯原始碼]
在運行Linux 4.0及以上內核的發行版中,可以通過 sysfs 接口查看 UEFI 系統位數。試着運行:
$ cat /sys/firmware/efi/fw_platform_size
如果返回 64
則代表 64 位(x86_64) UEFI 系統,如果返回 32
則代表 32 位(IA32) UEFI 系統。如果文件不存在,那麼代表並沒有進入 UEFI 模式。
macOS 系統[編輯 | 編輯原始碼]
2008年以前的 Mac 大都使用 i386-efi 固件, 2008年以後大都使用 x86_64-efi 。有能力運行 Mac OS X Snow Leopard 64位內核的 Mac 都是 x86_64 EFI 1.x 版的固件。 在 Mac OS 下輸入以下命令可以找出該 Mac 的 efi 固件:
$ ioreg -l -p IODeviceTree | grep firmware-abi
如果命令返回 EFI32 則對應的是 i386 EFI 1.x 版本的固件,返回 EFI64 對應的則是 x86_64 EFI 1.x 版的固件. Mac 沒有 UEFI 2.x 固件,Apple的 EFI 實現也不完全跟 UEFI 標準兼容。
Windows 系統[編輯 | 編輯原始碼]
64 位的 Windows 系統不支持在 32 位 UEFI 上啟動。所以如果你在 UEFI 模式下啟動了 32 位 Windows,那麼你使用的是 32 位 UEFI。
可以通過運行 msinfo32.exe
來查看系統位數。請看 系統摘要 條目下「系統類型」和「BIOS模式」對應的值。
如果是 64 位 UEFI 上的 64 位 Windows,則會有 系統類型:基於x64的電腦
和 BIOS 模式:UEFI
;如果是 32 位 UEFI 上的 32 位 Windows,則會有 系統類型:基於x86的電腦
和 BIOS 模式:UEFI
.如果「BIOS」模式不是 UEFI
,那麼 Windows 並沒有用 UEFI 模式啟動.
Linux 內核中有關 UEFI 的配置選項[編輯 | 編輯原始碼]
UEFI 系統所要求的 Linux 內核配置選項[1]如下:
CONFIG_RELOCATABLE=y CONFIG_EFI=y CONFIG_EFI_STUB=y CONFIG_X86_SYSFB=y CONFIG_FB_SIMPLE=y CONFIG_FRAMEBUFFER_CONSOLE=y
UEFI 運行時變量支持(efivarfs 文件系統 —— /sys/firmware/efi/efivars
)。該選項十分重要,因為它是使用如 /usr/bin/efibootmgr
的工具操作 UEFI 運行時變量所必須的。下面的選項已添加進了 3.10 及更新版本的內核中。
CONFIG_EFIVAR_FS=y
UEFI 運行時變量支持(老式 efivars sysfs 接口 —— /sys/firmware/efi/vars
))。應當禁用該選項來避免同時啟用 efivarfs 和 sysfs-efivars 所導致的潛在問題。
CONFIG_EFI_VARS=n
GUID 分區表 (GPT) 配置選項 —— UEFI 支持的強制需求
CONFIG_EFI_PARTITION=y
EFI 混合模式支持 —— 在 IA32 UEFI 上啟動 x86_64 內核。
CONFIG_EFI_MIXED=y
UEFI 變量[編輯 | 編輯原始碼]
UEFI 定義了變量,通過它們作業系統可以與固件進行交互。 UEFI 引導變量只在早期系統啟動時由引導加載程序和作業系統使用。UEFI運行時變量允許作業系統來管理固件的某些設置(如UEFI引導管理器)或 UEFI Secure Boot 協議的密鑰。你可通過下面的命令來獲得變量列表:
$ efivar -l
Linux 內核中的 UEFI 變量支持[編輯 | 編輯原始碼]
Linux 內核通過兩個接口來把 EFI 變量數據傳遞給用户空間:
- 老式 sysfs-efivars 接口 (CONFIG_EFI_VARS) - 由位於
/sys/firmware/efi/vars
的內核模塊efivars
生成 - 每個變量數據最大大小為1024B, 不支持 UEFI Secure Boot 變量(由於大小限制),並再也不被上游推薦使用。現仍被上游支持但在 Arch 官方內核中已完全禁用。
- 新式 efivarfs (EFI VARiable FileSystem) 接口 (CONFIG_EFIVAR_FS) - 由位於
/sys/firmware/efi/efivars
的efivarfs
內核模塊掛載使用 - 老式 sysfs-efivars 接口的替代品,不限制變量數據大小,支持 UEFI Secure Boot 變量並被上游推薦使用。在3.8版的內核中引入,新的efivarfs
模塊在3.10版內核中從舊的efivars
內核模塊中分離。
efivarfs 和 sysfs-efivars 的不一致[編輯 | 編輯原始碼]
同時啟用老式的 sysfs-efivars 和新式的 efivarfs 會導致數據不一致的問題(更多信息見 https://lore.kernel.org/lkml/1366148520-29954-4-git-send-email-matt@console-pimps.org/ )。由於(自從 core/linux包-3.11 和 core/linux-lts包-3.10)老式的 sysfs-efivars 在 Arch 官方內核中已完全禁用,新式的 efivarfs 將會被繼續地啟用/支持下去。自2013年10月1日起,在官方源中所有與 UEFI 變量相關的工具都支持 efivarfs.
efi_pstore
在 Arch 官方內核中也被禁用,因為 EFI pstore 功能依賴老式 sysfs-efivars 支持。如果在使用任何用户空間工具訪問 EFI VAR 數據前你同時開啟了這兩者,請禁用其中之一併重新開啟另一個接口 (為了刷新數據和防止不一致) :
禁用 sysfs-efivars 並刷新 efivarfs:
# modprobe -r efivars # umount /sys/firmware/efi/efivars # modprobe -r efivarfs # modprobe efivarfs # mount -t efivarfs efivarfs /sys/firmware/efi/efivars
禁用 efivarfs 並刷新 sysfs-efivars:
# umount /sys/firmware/efi/efivars # modprobe -r efivarfs # modprobe -r efivars # modprobe efivars
UEFI 變量正常工作的需求[編輯 | 編輯原始碼]
- 內核處理器的位數應該與 EFI 處理器的位數相符。
- 內核應以 EFI 模式(通過 EFISTUB 或 EFI 引導器,而不是 BIOS/CSM 或者同為 BIOS/CSM 的"bootcamp")啟動。
- EFI 運行時服務支持應出現在內核中 (
CONFIG_EFI=y
, 運行zgrep CONFIG_EFI /proc/config.gz
來核對是否共存 ). - EFI 運行時服務在內核命令行中不應被禁用,即不應使用內核參數
noefi
. efivarfs
文件系統應被掛載在/sys/firmware/efi/efivars
, 否則參考下文 #掛載 efivarfs 部分。efivar
應無錯列出 (選項-l
) EFI 變量。參見輸出內容 #UEFI 變量.
如果 EFI 變量支持在滿足以上條件後仍有問題,嘗試以下解決方案:
- 如果所有的用户空間工具都不能修改 EFI 變量數據,檢查
/sys/firmware/efi/efivars/dump-*
文件是否存在。如果是,刪掉,重啟,再試一次。 - 如果上面的步驟沒有解決問題,嘗試以內核參數
efi_no_storage_paranoia
啟動以禁用內核 EFI 變量存儲空間來防止對 EFI 變量的寫入/修改。
efi_no_storage_paranoia
僅當需要時使用且不應留下作為正常啟動參數。該內核參數的效果是關閉正在實施的安全保護,來避免 NVRAM 過滿時機器故障。掛載 efivarfs[編輯 | 編輯原始碼]
如果 efivarfs
啟動時並沒有被 systemd 自動掛載在 /sys/firmware/efi/efivars
, 你需要手動掛載來把 EFI 變量支持傳遞給像 efibootmgr
等的用户空間工具:
# mount -t efivarfs efivarfs /sys/firmware/efi/efivars
如下通過 /etc/fstab
來自動掛載 efivarfs
也是極好的:
/etc/fstab
efivarfs /sys/firmware/efi/efivars efivarfs defaults 0 0
用户空間工具[編輯 | 編輯原始碼]
只有少量工具能夠訪問/修改 UEFI 變量,即
- efivar — 操作 UEFI 變量的庫和工具 (被 efibootmgr 用到)
- efibootmgr — 操作 UEFI 固件啟動管理器設置的工具
- uefivars — 轉儲 UEFI 變量和 PCI 相關信息 (內部使用 efibootmgr 源碼)
- efitools — 創建與設置自己的 UEFI Secure Boot 證書,密鑰和簽名過的程序的工具 (需要 efivarfs)
- Ubuntu的固件測試套件 — 固件檢查工具
efibootmgr[編輯 | 編輯原始碼]
- 如果
efibootmgr
完全無效,你可以重啟進入 UEFI Shell 使用bcfg
命令來給引導器創建一個啟動條目。 - 如果你不能使用
efibootmgr
, 某些 UEFI 固件允許用户用內建的啟動時界面管理啟動條目。例如,某些華碩機有 "Add New Boot Option" 選項,能讓你選擇本地 EFI 系統分區並手動進入 EFI 存根位置 (例如\EFI\refind\refind_x64.efi
). - 下面的命令用 rEFInd 引導器作為例子。
要通過 efibootmgr 添加新的啟動參數,需要確認:
- 包含 ESP 的磁盤編號:
/dev/sdX
- ESP 在第幾個分區
/dev/sdXY
中的Y
- UEFI 程序相對 ESP 根目錄的路徑
假設要啟動的引導器文件是 /boot/efi/EFI/refind/refind_x64.efi
,/boot/efi
是 ESP 的掛載目錄
$ findmnt /boot/efi
TARGET SOURCE FSTYPE OPTIONS /boot/efi /dev/sda1 vfat rw,flush,tz=UTC
上面結果説明 ESP 位於 /dev/sda
,分區編號是 1. UEFI 程序相對於 ESP 根的路徑是/EFI/refind/refind_x64.efi
. 應該用下面 efibootmgr 語句創建:
# efibootmgr --create --disk /dev/sda --part 1 --loader /EFI/refind/refind_x64.efi --label "rEFInd Boot Manager"
參考efibootmgr(8) 或 efibootmgr README。
\
作為路徑分隔符 (類似於 Windows 路徑),Efibootmgr 解析路徑之前內部會把 /
轉換為 \
.UEFI Shell[編輯 | 編輯原始碼]
UEFI Shell 是固件的終端,可用於啟動包括引導器的 UEFI 程序。除此之外, Shell也可用於採集固件和系統的各種信息,例如內存映射 (memmap), 修改啟動管理器變量 (bcfg), 運行分區程序 (diskpart), 加載 UEFI 驅動,編輯文本文件 (edit), 十六進制編輯等等。
獲取 UEFI Shell[編輯 | 編輯原始碼]
你可從 Intel 的 Tianocore UDK/EDK2 Sourceforge.net 工程下載以 BSD 許可證發佈的 UEFI Shell.
- uefi-shell-gitAUR 包 (推薦) - 為 x86_64 系統提供 x86_64 Shell 以及為 i686 系統提供 IA32 Shell - 直接從 Tianocore EDK2 最新的源碼編譯
- Precompiled UEFI Shell v2 binaries[失效連結 2020-08-06 ⓘ] (may not be up-to-date)
- Precompiled UEFI Shell v1 binaries[失效連結 2020-08-06 ⓘ] (not updated anymore upstream)
- UEFI Shell v2 binary with bcfg modified to work with UEFI pre-2.3 firmware[失效連結 2020-08-06 ⓘ] - from Clover EFI bootloader
Shell v2 在 UEFI 2.3+ 系統上表現最好,並比 Shell v1 優先推薦。Shell v1 應該在所有 UEFI 系統上有效並且與它們遵循的 UEFI 標準版本無關。更多信息見 ShellPkg。
啟動 UEFI Shell[編輯 | 編輯原始碼]
部分基於 AMI Aptio x86_64 UEFI 固件的主板 (從 Sandy Bridge 起,尤其是華碩) 提供了一個叫做 "Launch EFI Shell from filesystem device"
的選項。對於這些主板,下載 x86_64 UEFI Shell ,複製進 EFI 系統分區,命名為 <EFI_SYSTEM_PARTITION>/shellx64.efi
(大部分是 /boot/efi/shellx64.efi
) .
Phoenix SecureCore Tiano UEFI 固件已內嵌 UEFI Shell, 可按 F6
, F11
或 F12
鍵來啟動。
Shell.efi
複製到 (USB)/efi/boot/bootx64.efi
. 這個 USB 會出現在固件的啟動菜單裏。啟動它就會啟動到 UEFI Shell.重要 UEFI Shell 命令[編輯 | 編輯原始碼]
UEFI Shell 命令通常支持 -b
選項,它在輸出的每頁末尾暫停. 運行 help -b
來列出所有可用命令。
更多信息見 https://software.intel.com/en-us/articles/efi-shells-and-scripting/
bcfg[編輯 | 編輯原始碼]
bcfg
命令用於修改 UEFI NVRAM 條目,它能讓用户改變啟動條目或驅動器選項。在[https://www.uefi.org/sites/default/files/resources/UEFI_Shell_Spec_2_0.pdf
UEFI Shell Specification 2.0] PDF 文档的 83 页(Section 5.3) 有详细说明。
- 僅當
efibootmgr
無法創建啟動條目時才推薦嘗試bcfg
. - UEFI Shell v1 官方二進制文件不支持
bcfg
命令。你可以下載一個 modified UEFI Shell v2 二進制文件[失效連結 2020-08-06 ⓘ],它在 UEFI 2.3前的固件有效。
轉儲當前啟動條目:
Shell> bcfg boot dump -v
為 rEFInd (作為例子) 添加一個啟動菜單條目,在啟動菜單裏是第4個 (從0開始計數) 選項:
Shell> bcfg boot add 3 fs0:\EFI\refind\refind_x64.efi "rEFInd"
fs0:
映射到 EFI 系統分區,fs0:\EFI\refind\refind_x64.efi
i是要啟動的文件。
To add an entry to boot directly into your system without a bootloader, configure a boot option using your kernel as an EFISTUB}:
Shell> bcfg boot add N fsV:\vmlinuz-linux "Arch Linux" Shell> bcfg boot -opt N "root=/dev/sdX# initrd=\initramfs-linux.img"
where N
is the priority, V
is the volume number of your EFI partition, and /dev/sdX#
is your root partition.
刪除第4個啟動選項:
Shell> bcfg boot rm 3
把第3個啟動選項移動到第0 (也就是説第1個是 UEFI 啟動菜單的默認啟動選項):
Shell> bcfg boot mv 3 0
bcfg 幫助文檔:
Shell> help bcfg -v -b
或:
Shell> bcfg -? -v -b
map[編輯 | 編輯原始碼]
map
displays a list of device mappings i.e. the names of available file systems (fs0
) and storage devices (blk0
).
Before running file system commands such as cd
or ls
, you need to change the shell to the appropriate file system by typing its name:
Shell> fs0: fs0:\> cd EFI/
edit[編輯 | 編輯原始碼]
EDIT 命令提供了類似於 nano 界面的基本編輯器,但是功能略少一點。它以 UTF-8 編碼並且行尾結束符兼容 LF 和 CRLF.
本例中,編輯在固件 EFI 系統分區 (fs0:
中 rEFInd 的 refind.conf
Shell> edit FS0:\EFI\refind\refind.conf
輸入 Ctrl-E
以獲得幫助。
UEFI 可啟動介質[編輯 | 編輯原始碼]
從 ISO 創建 UEFI 可啟動 USB[編輯 | 編輯原始碼]
教程見 USB flash installation medium#Using the ISO as is (BIOS and UEFI).
從光學介質裡移除 UEFI 啟動支持[編輯 | 編輯原始碼]
大部分32位 EFI Mac 機和部分64位 EFI Mac 機無法從 UEFI(X64)+BIOS 可啟動 CD/DVD 啟動。如果希望使用光學介質完成安裝,可能首先需要移除 UEFI 啟動支持。
- 掛載官方安裝介質並如前所述獲取
archisolabel
.
# mount -o loop input.iso /mnt/iso
- 然後重建 ISO, 使用 libisoburn包 的
xorriso
移除 UEFI 光學介質啟動支持。確認已設置正確的 archisolabel, 例如 "ARCH_201411"或類似的:
$ xorriso -as mkisofs -iso-level 3 \ -full-iso9660-filenames\ -volid "archisolabel" \ -appid "Arch Linux CD" \ -publisher "Arch Linux <https://archlinux.org>" \ -preparer "prepared by $USER" \ -eltorito-boot isolinux/isolinux.bin \ -eltorito-catalog isolinux/boot.cat \ -no-emul-boot -boot-load-size 4 -boot-info-table \ -isohybrid-mbr "/mnt/iso/isolinux/isohdpfx.bin" \ -output output.iso /mnt/iso/
- 把
output.iso
燒制進光學介質並照常完成安裝。
原生無支持情況下測試 UEFI[編輯 | 編輯原始碼]
虛擬機使用 OVMF[編輯 | 編輯原始碼]
OVMF 是一個將 UEFI 添加到虛擬機的 tianocore 項目。OVMF 包含了一個 QEMU 使用的示例 UEFI 固件。
安裝 edk2-ovmf包.
建議先將虛擬機的非易逝變量本地保存一份。
$ cp /usr/share/ovmf/ovmf_vars_x64.bin my_uefi_vars.bin
然後在 QEME 命令中加入:
-drive if=pflash,format=raw,readonly,file=/usr/share/ovmf/ovmf_code_x64.bin \ -drive if=pflash,format=raw,file=my_uefi_vars.bin
示例:
$ qemu-system-x86_64 -enable-kvm -m 1G -drive if=pflash,format=raw,readonly,file=/usr/share/ovmf/ovmf_code_x64.bin -drive if=pflash,format=raw,file=efi_vars.bin …
僅 BIOS 的系統使用 DUET[編輯 | 編輯原始碼]
DUET 是一個 tianocore 工程用以從 BIOS 啟動到完整 UEFI 環境,這與 BIOS 啟動作業系統相似。在 https://www.insanelymac.com/forum/topic/186440-linux-and-windows-uefi-boot-using-tianocore-duet-firmware/ 裡有廣泛討論。預建立的 DUET 鏡像可從其中一個源 https://gitorious.org/tianocore_uefi_duet_builds[失效連結 2020-08-06 ⓘ] 下載。教程見 https://gitorious.org/tianocore_uefi_duet_builds/tianocore_uefi_duet_installer/blobs/raw/master/Migle_BootDuet_INSTALL.txt[失效連結 2020-08-06 ⓘ].
也可考慮 https://sourceforge.net/projects/cloverefiboot/ , 它提供的 DUET 鏡像可能包含了一些系統的專用補丁,並且比 gitorious 源更新得更頻繁。
疑難問題[編輯 | 編輯原始碼]
困在 Windows 時啟動到 Arch Linux[編輯 | 編輯原始碼]
當被困在 Windows 時,要啟動到 Arch Linux,可以通過 Windows PowerShell 命令 shutdown /r /o
或者通過設置 > 更新與安全 > 恢復 > 高級啟動,選擇現在重啟 到達 Windows 的高級啟動。當你到達高級啟動菜單時,選擇使用設備,這個菜單實際上包含你的 UEFI 啟動選項(不限於 USB 或 CD,也可以啟動硬盤中的作業系統),並選擇「Arch Linux」。
Windows 7 無法以 UEFI 模式啟動[編輯 | 編輯原始碼]
如果你把 Windows 安裝進了另一個 GPT 格式的硬盤並且你電腦裡還有一個 MBR 格式的硬盤,那麼可能 UEFI 固件啟動了 CSM 支持(為從 MBR 分區啟動的支持) 因而 Windows 無法啟動。為解決問題,把 MBR 硬盤的內容合併到 GPT 硬盤中並禁用 MBR 硬盤使用的 SATA 接口或者直接把硬盤拔下來。
有此類問題的主板:
Gigabyte Z77X-UD3H rev. 1.1 (UEFI 版本 F19e)
- 固件啟動選項 "UEFI Only" 並不妨礙以 CSM 啟動。
Windows 改變了啟動次序[編輯 | 編輯原始碼]
例如你升級 Windows 後直接啟動了Windows而不是選擇啟動菜單:
- 確定UEFI固件設置中的"安全啟動"(Secure Boot) 和 Windows 中的"快速啟動" 選項沒有啟用.
- 確定UEFI固件設置的啟動順序中Linux Boot Manager 先於 Windows Boot Manager.
你可以通過組策略和一個批處理文件(".bat")來阻止Windows更改啟動設置,在Windows上這樣做:
- 以管理員身份打開命令提示符,運行
bcdedit /enum firmware
- 尋找描述中帶有"linux"的啟動選項,例如 "Linux Boot Manager"
- 複製帶大括號的描述符, 例如
{31d0d5f4-22ad-11e5-b30b-806e6f6e6963}
- 創建一個批處理文件 (例如
bootorder.bat
) ,包含下列的內容:bcdedit /set {fwbootmgr} DEFAULT {這裏是你在第三步中獲得的描述符}
(例如bcdedit /set {fwbootmgr} DEFAULT {31d0d5f4-22ad-11e5-b30b-806e6f6e6963}
). - 運行 gpedit (組策略對象編輯器) 在 本地計算機策略 > 計算機設置 > Windows 設置 > 腳本(啟動/關機)中,選擇"啟動,會打開一個名為"啟動選項:的對話框.
- 添加第四步中創建的批處理文件到"腳本"列表中.
或者讓Windows 啟動管理器加載systemd-boot的EFI應用程式,要這樣做的話在Windows上以管理員身份運行:
bcdedit /set {bootmgr} path \EFI\systemd\systemd-bootx64.efi
USB 介質卡在黑屏界面[編輯 | 編輯原始碼]
可能是 KMS 的問題。從 USB 啟動時嘗試 Disabling KMS.
參見[編輯 | 編輯原始碼]
- Wikipedia:UEFI
- UEFI Forum - contains the official UEFI Specifications - GUID Partition Table is part of UEFI Specification
- UEFI boot: how does that actually work, then? - A blog post by AdamW
- Linux Kernel x86_64 UEFI Documentation
- Intel's page on EFI
- Intel Architecture Firmware Resource Center
- Matt Fleming - The Linux EFI Boot Stub
- Matt Fleming - Accessing UEFI Variables from Linux
- Rod Smith - Linux on UEFI: A Quick Installation Guide
- UEFI Boot problems on some newer machines (LKML)
- LPC 2012 Plumbing UEFI into Linux[失效連結 2021-05-17 ⓘ]
- LPC 2012 UEFI Tutorial : part 1[失效連結 2021-05-17 ⓘ]
- LPC 2012 UEFI Tutorial : part 2[失效連結 2021-05-17 ⓘ]
- Intel's TianoCore Project for Open-Source UEFI firmware which includes DuetPkg for direct BIOS based booting and OvmfPkg used in QEMU and Oracle VirtualBox
- FGA: The EFI boot process
- Microsoft's Windows and GPT FAQ
- Convert Windows x64 from BIOS-MBR mode to UEFI-GPT mode without Reinstall
- Create a Linux BIOS+UEFI and Windows x64 BIOS+UEFI bootable USB drive
- Rod Smith - A BIOS to UEFI Transformation
- EFI Shells and Scripting - Intel Documentation
- UEFI Shell - Intel Documentation
- UEFI Shell - bcfg command info
- The bootstrap process on EFI systems