標籤:一段 log main div ring dsc html 入口 一點
本文旨在簡單的介紹一下UEFI的模組機制:
BIOS是固化在電腦主板上的一段程式,主要功能就是初始化主板,最後載入作業系統(OS);而UEFI通俗一點講就是一種BIOS的規範,它提出了一種BIOS的實現架構並提供了一套開源的實現。
我們知道Linux的模組機制是通過宏來定義模組的進入點的(參考:Linux學習筆記之核心啟動流程與模組機制),而UEFI的模組機制理解起來更容易,它的每個模組都有一個inf檔案,裡面描述了模組的詳細資料,比如進入點(入口函數)、模組包含哪些源檔案等。
以隨身碟驅動為例:\MdeModulePkg\Bus\Usb\UsbMassStorageDxe\(UEFI的一個模組就是一個目錄)
UsbMassStorageDxe.inf
1 ## 2 [Defines] 3 INF_VERSION = 0x00010005 4 BASE_NAME = UsbMassStorageDxe 5 MODULE_UNI_FILE = UsbMassStorageDxe.uni 6 FILE_GUID = 9FB4B4A7-42C0-4bcd-8540-9BCC6711F83E 7 MODULE_TYPE = UEFI_DRIVER 8 VERSION_STRING = 1.0 9 ENTRY_POINT = USBMassStorageEntryPoint10 11 ##13 [Sources]14 UsbMassBoot.h15 UsbMassImpl.h16 UsbMassBot.h17 UsbMassBot.c18 ComponentName.c19 UsbMassImpl.c20 UsbMassBoot.c21 ....
ENTRY_POINT指明了模組的進入點,當這個模組被運行時,是從USBMassStorageEntryPoint()這個函數開始啟動並執行。
[Sources]下麵包含的是模組的源檔案。
那這些模組是如何被載入啟動並執行呢?
首先,在Build系統時,通過.fdf .dsc檔案指出我們想包含哪些模組(想包含某個模組,就把對應的inf檔案的路徑添加到這兩隻檔案中,他們的作用類似於Makefile檔案);之後在代碼執行過程中,還是看DXE階段,DXE階段的進入點是DxeMain(),執行一些必要的初始化之後,會執行CoreDispatcher(),CoreDispatcher()負責找到系統中所有的模組,並執行他們的入口函數。
UEFI架構最主要的階段就是DXE階段,而這個階段跟Linux的執行很像。個人認為UEFI在設計時一定從Linux的設計思想中擷取了很多的靈感(比如Linux通過宏來指定模組的進入點)。
BIOS學習筆記之UEFI模組機制