UEFI的Handle和Protocol简单理解

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值