EFI Driver再被LoadImage()載入進記憶體之前,是存在於儲存空間中的,例如:系統ROMs,Flash晶片,PCI option ROM,或者網路伺服器中。
(1)LoadImage()
LoadImage()為Boot Service,通過調用LoadImage()將driver載入進記憶體,同時該driver會產生自己的Image Handle,並且在Image Handle下安裝EFI_LOADED_IMAGE_PROTOCOL,注意此時driver只是當做Image處理的,還不能明確它就是driver
(2)StartImage()
通過StartImage()啟動driver,driver會在Image Handle上安裝其他的Protocol,如果為EFI Driver Model的driver,那麼會安裝EFI_DRIVER_BINDING_PROTOCOL,這時Driver Image才真正被當做Driver來處理
(3)ConnectController()
LoadImage()和StartImage()之後,driver會等待被ConnectController()調用去串連到某個Controller。其實這時在記憶體中已經Load了很多的Driver都在等待被connect到controller,這時ConnectController()會以輪詢方式去調用每個Driver Handle中的EFI_DRIVER_BINDING_PROTOCOL.Supported(),如果返回EFI_SUCCESS,那麼該driver就會被connect到controller上了。
對於匯流排驅動和裝置驅動,在Connect到Controller的時候所做的動作是不一樣的。例如PCI匯流排驅動串連到PCI主橋之後,它會為每個PCI Device建立Child Device Handle,而PCI裝置驅動不能建立新的Handle,它只是在Device Handle上安裝Protocol Interface。
(4)匯流排驅動
匯流排驅動會為在該匯流排上發現的子裝置建立新的Device Handle,並且會在Child Device Handle上安裝一些Protocol Interface。該操作是通過EFI_DRIVER_BINDING_PROTOCOL.Start()來完成的。
(5)裝置驅動
裝置驅動不允許創造任何的新的Child Device Handle,它只是在現存的裝置Handle上安裝其他的協議介面。大多數常見裝置驅動負責把I/O抽象掛到由匯流排驅動所創造的裝置Device Handle上,該I/O抽象可以被用於啟動EFI相容的作業系統。
(6)下面通過EFI_DRIVER_BINDING_PROTOCOL的代碼來看一下。
typedef struct _EFI_DRIVER_BINDING_PROTOCOL {EFI_DRIVER_BINDING_PROTOCOL_SUPPORTED Supported;EFI_DRIVER_BINDING_PROTOCOL_START Start;EFI_DRIVER_BINDING_PROTOCOL_STOP Stop;UINT32 Version;EFI_HANDLE ImageHandle;EFI_HANDLE DriverBindingHandle;} EFI_DRIVER_BINDING_PROTOCOL;