UEFI下windows啟動過程

來源:互聯網
上載者:User

標籤:優先   coff   get   add   img   中斷   ice   分配   device   

引導檔案 
在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值標識。 
 
每個ENTRY下有一個Description和Elements,其中Description就是這個ENTRY的描述資訊,而Elements則是一系列索引值對,其中鍵用一個數字表示,比如12000004就是引導名稱,而1100001則是引導位置資訊,這個索引值對在BOOTICE中就表現位右邊那一欄。 
 
 
引導定位 
現在分析這個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進入核心。

UEFI下windows啟動過程

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.