DxeCore 维护一个协议数据库,数据库中包含有句柄, 协议和接口。 协议以GUID命名,由数据结构表示,数据结构可能
为空,可能包含函数指针,也可能两者都包含。接口是协议的具体实现。与面向对象概念类比,协议等同与类,接口等
同于类的实例。
协议数据库
在UEFI 概念中,一个句柄(handle) 上安装有一个或多个协议(protocol )的具体实现(interface),针对某个特定的协议,一个句柄上只允许安装一个对应的接口。安装的操作通过InstallMultipleProtocolInterfaces(), InstallProtocolInterface() 完成。从句柄上卸载Interface 的操作通过UninstallMultiprotocolInterfaces(), UninstallProtocolInterface() 完成。通过HandleProtocol() 可以查询系统中安装特定协议的句柄列表。通过这些接口,我们实现了驱动A安装某个协议的接口,驱动B查询并使用该接口。
UEFI 驱动模型
当驱动程序被DXECore 加载入内存后,DxeCore 会为该驱动程序创建一个Image句柄并在句柄上安装LoadImage 协议,然后DxeCore 会调用该驱动程序的入口函数。不符合UEFI 驱动模型的驱动程序会在入口函数初始化硬件并退出。但符合UEFI 驱动模型的驱动程序不在入口函数对硬件进行编程,仅仅在IMAGE 句柄上安装DriverBinding 协议。所有驱动程序在被加载并运行的,将等待EFI 启动管理器(Boot Manager) 通过它们管理一个或者多个硬件设备。EFI 启动管理器通过ConnectController, ConnectController 通过调用 DriverBinding 的Supported 和start 来连接驱动程序到硬件设备