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

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


 

 

 

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值