UEFI下windows啟動過程


引導文件 
在UEFI安裝完操作系統后,Windows至少使用兩個分區,一個叫做ESP分區(EFI SYSTEM PARTITION),用於存放啟動文件,另一個則是BIOS下正常的系統分區,不同的是,BIOS下引導文件是winload.exe,UEFI下引導文件式winload.efi,兩者都是pecoff格式的,但UEFI用的是各種固件接口,而BIOS使用的是中斷。有時還會有一個MSR分區,不過這個分區並不重要,實驗可以刪除。 
安裝完成后,Windows還會將自己的啟動管理器的信息寫入固件的優先啟動項中,這樣在BDS階段,固件會默認引導Windows啟動管理器。默認情況下,UEFI固件加載的啟動文件式EFI\BOOT\bootx64.efi(bootia32.efi),而Windows強制寫入的啟動項則會加載EFI\MICROSOFT\BOOT\bootmgfw.efi,這兩個文件其實是一模一樣的文件。 
注冊表項 
系統安裝完成后,安裝程序會將引導信息保存在ESP中的BCD文件中,路徑為EFI\microsoft\boot\BCD,BCD文件是一個注冊表巢文件,反應到注冊表里就是LOCAL_MACHINE下的BCD00000000,一般情況下hivelist是不導入這個文件的,我們可以在regedit中手工導入這個文件來查看。現在可以通過BOOTICE和REGEDIT一起看來理解這個文件。在Object下面是所有的啟動ENTRY,每個ENTRY用一個GUID值標識。 
BCD00000000 
每個ENTRY下有一個Description和Elements,其中Description就是這個ENTRY的描述信息,而Elements則是一系列鍵值對,其中鍵用一個數字表示,比如12000004就是引導名稱,而1100001則是引導位置信息,這個鍵值對在BOOTICE中就表現位右邊那一欄。 
所有Entry 
這里寫圖片描述 
引導定位 
現在分析這個1100001,選擇完要啟動的操作系統后,啟動管理器就是從這個鍵值對來確定加載哪個分區的winload.efi。打開DiskGenius,點擊系統分區,看它的分區GUID,可以看出0x20處的16字節是分區GUID,而0X38開始的16字節則是硬盤GUID。 
在UEFI系統中,各種設備使用設備路徑來標識,比如分區的路徑可能就是pcicontroller()/pci(0,1)/sata(0,0,0)/hd(2,分區GUID,起始地址,結束地址)。 
這里寫圖片描述 
而對於Windows的loader來說,它只需要一個滿足這樣條件的設備路徑就可以從那個設備啟動:倒數第二個設備安裝有EFI_BLOCK_IO_PROTOCOL,這樣它就可以讀取磁盤GUID來和0x38處的值進行比較,而倒數第一個設備是個分區設備(MSG_DP_TYPE),loader會通過這個設備的GUID和注冊表中的進行比較來確定啟動分區,這兩個都匹配,那么Windows便會加載一個小型的NTFS文件系統,然后嘗試着從那個分區設備中加載12000002也就是BOOTICE中ApplicationPath指定的引導文件。 
啟動過程 
啟動管理器(bootxxx.efi)會首先加載BCD文件,從BCD中讀取所有啟動項,如果有多個啟動項並且沒有默認啟動項就會有一個菜單來顯示,當用戶選中其中某個啟動項后,啟動管理器就會從對應的分區(通過分區GUID)中讀取winload.efi,如果這時找不到winload.efi,或者winload.efi簽名校驗失敗,就會藍屏0xc000000e,即找不到引導文件,加載完winload.efi后,控制權就正式交給winload.efi。 
Winload.efi做的第一件事就是通過BootService的GetMemoryMap提供的物理內存信息來構造頁表以及PFN數據庫,然后將ntoskrnl,hal以及SYSTEM\Service下的所有Boot型驅動以及他們需要的導入庫讀取加載到內存中,因為此時還是保護模式下,所以需要頁表中建立這些文件的映射信息。(在IA32e下的UEFI開機后是會默認開啟分頁的,但是虛擬內存和物理內存是1:1映射的,所以進了Windows內核后不可能還用原來的地址)讀取完成后,會對這些文件進行簽名校驗,如果校驗失敗,那么會藍屏INACCESSIBLE_BOOT_DEVICE,即啟動設備無效。這一步完成后,Windows會進一步初始化GDT和IDT,然后在頁表中分配內核堆棧,初始化SystemPTE。最后調用ExitBootService退出引導階段,調用SetVirtualAddress將EFI部分固件內存映射到虛擬內存,然后把頁表基址載入CR3寄存器,開啟分頁並跳轉到ntoskrnl的KiSytemStartup進入內核。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM