EFI Driver初始化过程

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

EFI Driver初始化过程_第1张图片

(2)StartImage()

通过StartImage()启动driver,driver会在Image Handle上安装其他的Protocol,如果为EFI Driver Model的driver,那么会安装EFI_DRIVER_BINDING_PROTOCOL,这时Driver Image才真正被当做Driver来处理

EFI Driver初始化过程_第2张图片

(3)ConnectController()

LoadImage()和StartImage()之后,driver会等待被ConnectController()调用去连接到某个Controller。其实这时在内存中已经Load了很多的Driver都在等待被connect到controller,这时ConnectController()会以轮询方式去调用每个Driver Handle中的EFI_DRIVER_BINDING_PROTOCOL.Supported(),如果返回EFI_SUCCESS,那么该driver就会被connect到controller上了。

 

EFI Driver初始化过程_第3张图片

对于总线驱动和设备驱动,在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()来完成的。

 

EFI Driver初始化过程_第4张图片

(5)设备驱动

设备驱动不允许创造任何的新的Child Device Handle,它只是在现存的设备Handle上安装其他的协议接口。大多数常见设备驱动负责把I/O抽象挂到由总线驱动所创造的设备Device Handle上,该I/O抽象可以被用于启动EFI兼容的操作系统。

EFI Driver初始化过程_第5张图片

(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;


 

 

 

你可能感兴趣的:(EFI Driver初始化过程)