BIOS 沒落
BIOS 是長期以來 PC 上最具有代表性的韌體,而近年來,BIOS 已經被標準化的 UEFI 取代,
相對于新式的 UEFI, 傳統的 BIOS 被稱為 Legacy 方式,
現在 PC 的默認啟動方式基本都是 UEFI,但為了兼容,也保留了對 Legacy 的支持,

開機流程
BIOS 方式:
BIOS 是主板上固化的一塊 flash 芯片,它在 PC 上電后最先啟動,然后根據里面固化的程式,按步驟把主要硬體挨個檢查一遍,接著去硬碟找引導程式,把引導權交給它,隨后就進入系統了,
UEFI 方式:
可以理解為,UEFI 方式在啟動流程上,省略了上述自檢程序,直接將控制權交給引導程式,
自檢
但是,UEFI 并不是不進行自檢,而是榷訓了自檢的概念,強化了自檢的功能,簡單講就是,BIOS 其實也只能進行一些簡單的自檢,隨著技術的發展,這些簡單的自檢已經沒有必要了,而復雜的自檢,BIOS 又做不到,所以,UEFI 提供了框架,對復雜的設備可以單獨自檢,或者干脆等到 OS 加載時由 OS 來進行,
取消自檢流程確實縮短了啟動時間,這也是 win10 開機快的原因之一,
UEFI 優勢
作為 Legacy BIOS 的繼任者,UEFI 擁有前輩所不具備的諸多功能,比如圖形化界面、多種多樣的操作方式、允許植入硬體驅動等等,這些特性讓 UEFI 更加易用、更多功能、更加方便,
加上UEFI本身的開發語言已經從匯編轉變成 C 語言,高級語言的加入讓廠商深度開發UEFI變為可能,
Legacy BIOS 在讀取磁盤時,每次只能讀 64KB,非常低效,而 UEFI 每次可讀 1MB,載入更快,此外,win8/win10
更是進一步優化了 UEFI 的支持,號稱可以實作瞬時開機,
UEFI 和 BIOS 的區別
BIOS 方式在啟動作業系統前,必須從硬碟上指定扇區讀取系統啟動代碼(包含在主引導記錄中),然后從活動磁區中引導作業系統,
而 UEFI 已經具備檔案系統的支持,能夠直接讀取 FAT 磁區中的檔案,
對扇區的操作遠比不上對磁區中檔案的操作更直觀更簡單,
實戰
光說不練假把式,下面我們就來實戰一把,感受下 UEFI 的啟動方式,
大致流程是,我們把 PC 設定為 UEFI 啟動方式,優先從 U 盤啟動,而 U 盤又被我們事先格式化為 FAT32 格式,里面存放有我們的 UEFI 應用程式,
最終就是 UEFI 韌體,將我們撰寫的 UEFI 應用程式給啟動起來,

原始碼
main.c
struct EFI_SYSTEM_TABLE {
char _buf[60];
struct EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL {
unsigned long long _buf;
unsigned long long (*OutputString)(
struct EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
unsigned short *String);
unsigned long long _buf2[4];
unsigned long long (*ClearScreen)(
struct EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This);
} *ConOut;
};
void efi_main(void *ImageHandle __attribute__ ((unused)),
struct EFI_SYSTEM_TABLE *SystemTable)
{
SystemTable->ConOut->ClearScreen(SystemTable->ConOut);
SystemTable->ConOut->OutputString(SystemTable->ConOut, L"Hello UEFI!\n");
while (1);
}
編譯
$ x86_64-w64-mingw32-gcc -Wall -Wextra -e efi_main -nostdinc -nostdlib -fno-builtin -Wl,--subsystem,10 -o main.efi main.c
制作啟動盤
- 把 U 盤格式化為 FAT32 格式
- 將 main.efi 存放到 U 盤的 EFI/BOOT/ 檔案夾中,并重命名為 BOOTX64.EFI
啟動
關閉計算機,插入剛剛制作好的 U 盤啟動盤,確認 BIOS 中使用的是 UEFI 引導方式,并設定系統為 U 盤優先啟動,且要關閉 Secure Boot 選項,
保存,開機

特寫

可以看到,上電后先是顯示開機畫面(UEFI 韌體階段),接著立馬在螢屏上顯示 Hello UEFI!,正是下面這兩句代碼的作用,
SystemTable->ConOut->ClearScreen(SystemTable->ConOut); // 清屏
SystemTable->ConOut->OutputString(SystemTable->ConOut, L"Hello UEFI!\n"); // 列印 Hello UEFI!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/292402.html
標籤:其他
