文章目录
EFI_HANDLE
EFI_HANDLE是EFI(Ext Firmware Interface)规范中的一个重要念,用于标识和管理在系统中的各种和实体.UEFI通过扫描总线,为每一个设备建立一个Controller对象,用于控制各个设备,所有该设备的驱动都是以Protocol的形式安装在这个Controller中的,这个Controller就是一个EFI_HANDLE指针指向的对象。 当我们将一个.efi文件加载到内存中,UEFI也会为该文件建立一个Image对象,这个Image对象也是一个EFI_HANDLE对象。 在UEFI内部,EFI_HANDLE被理解为IHANDLE,这个IHANDLE包含了Protocols的链表,存放属于自己的Protocol,然后ALLHANDLE将所有的IHANDLE连接起来。
EFI_HANDLE 是一个指针
,指向某种对象
EFI_HANDLE 是一个指针
,应用如下:
1、UEFI会为每一个连接的设备建立一个EFI_HANDLE
指针指向的对象(controller)
2、当一个.efi文件被加载的时候,UEF也会为这个文件建立一个EFI_HANDLE
指向的对象(imageHandle)
从上面的应用中可知code里面广泛使用的controller和imagehandle都是指的是EFI_HANDLE
这个指针指向的对象
EFI_HANDLE
,指向对象实际上市一个名为IHANDLE的结构体- 设备驱动会以protocol形式安装到Handle上面
HANDLE架构
EFI_HANDLE代码举例跟踪
EFI_HANDLE
的定义如下:
typedef VOID *EFI_HANDLE;
EFI_HANDLE是一个 void *类型的数据,在C语言中这表示无明确类型的指针,就是说可以进行任意转换。符合我们前述的类型为指针、应用广泛。
EFI_HANDLE
指向的这段内存就是我们之前提到的对象,这个如下:
EFI_HANDLE *UserHandle;
IHANDLE *Handle;
Handle = NULL;
// ...
Handle = (IHANDLE *)*UserHandle;
转换成了 IHANDLE Handle = (IHANDLE )EFI_HANDLE的形式,即指向的对象为IHANDLE
IHANDLE
的定义如下:
///
/// IHANDLE - contains a list of protocol handles
///
typedef struct {
UINTN Signature;
/// All handles list of IHANDLE
LIST_ENTRY AllHandles;
/// List of PROTOCOL_INTERFACE's for this handle
LIST_ENTRY Protocols;
UINTN LocateRequest;
/// The Handle Database Key value when this handle was last created or modified
UINT64 Key;
} IHANDLE;
以上可见IHANDLE是一个非常标准且常见的结构体形式,我们所说的handle的实质也就是IHANDLE结构体。
展开上面结构体,关注一下LIST_ENTRY,这个成员是构成handle&protocol关系的重要联系,详细了解这个成员的结构对于理解handle&protocol有着很重要的帮助,结构如下:
typedef struct _LIST_ENTRY LIST_ENTRY;
///
/// _LIST_ENTRY structure definition.
///
struct _LIST_ENTRY {
LIST_ENTRY *ForwardLink;
LIST_ENTRY *BackLink;
};
这是一个简单的双向链表节点结构,链表的每一个节点连接的都是LIST_ENTRY结构体,也就是连接只存在于LIST_ENTRY结构体之间,而包含了LIST_ENTRY结构体的IHANDLE结构就能够通过其成员LIST_ENTRY AllHandles结构体产生相互连接。换句话说AllHandles能够形成一个链表,将IHANDLE按照某种方式串在一起,我们将形成的这个链表就称为Handledatabase链表
Handledatabase
Handle database是由Handles(链表)和Protocols(链表)组成的,是全局的,可以被任何UEFI Image访问。在执行完ExitBootServices()之后,Handle database就不存在了。
Handledatabase链表是一个环形的链表,其中头结点是一个空节点gHandleList,每次有新的IHANDLE结构体需要添加到链表中,就在头结点后面进行插入。Handledatabase就是我们需要强调掌握的第一个链表。
总的来说,在UEFI固件中,Handle Database只有一份,它是存储系统中所有Han