关于设备Handle的处理

本文探讨了不同层级中Handle结构体的应用及其重要性。Handle作为各层间的桥梁,承载着大量关键信息,确保了上下层之间的有效通讯。文章还强调了底层Handle对上层的透明性,为将来的扩展提供了便利。

关于设备Handle的处理

每一层的Handle都是不一样的结构体地址,底层Handle是上层Handle的一个变量。Handle结构体中有大量的本层程序所需要的信息,下层Handle对上层应该是不透明的,以备日后的扩展。

在 UEFI 环境中,获取当前启动设备的 `Handle` 是一个涉及系统启动流程和驱动模型的关键步骤。UEFI 通过 `Handle` 来管理设备和协议,每个设备在系统中都对应一个 `EFI_HANDLE` 对象,该对象用于安装与设备相关的协议,以便驱动程序和应用程序访问设备功能 [^1]。 在 UEFI 启动过程中,系统会加载驱动程序,并为每个驱动程序创建一个 `Image Handle`,同时在该句柄上安装 `LoadImage` 协议。随后,UEFI 启动管理器通过 `ConnectController` 函数尝试将驱动程序与硬件设备连接。`ConnectController` 会调用驱动程序的 `Supported` 和 `Start` 方法,以确定该驱动是否能管理某个设备 [^3]。 要获取当前启动设备的 `Handle`,通常需要在 UEFI 驱动或应用程序中使用 `gBS->LocateHandleBuffer` 或 `gBS->GetNextHandle` 等服务来枚举系统中的句柄,并查找与启动设备相关的协议,例如 `gEfiDevicePathProtocolGuid` 或 `gEfiBlockIoProtocolGuid`。 以下是一个使用 `gBS->LocateHandleBuffer` 获取设备句柄的示例代码: ```c #include <Uefi.h> #include <Library/UefiLib.h> #include <Library/ShellCEntryLib.h> #include <Protocol/DevicePath.h> #include <Protocol/BlockIo.h> EFI_STATUS EFIAPI UefiMain ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_STATUS Status; EFI_HANDLE *HandleBuffer = NULL; UINTN HandleCount = 0; UINTN Index; // 获取所有安装了 BlockIo 协议的设备句柄 Status = gBS->LocateHandleBuffer ( ByProtocol, &gEfiBlockIoProtocolGuid, NULL, &HandleCount, &HandleBuffer ); if (EFI_ERROR (Status)) { Print (L"Failed to locate BlockIo handles\n"); return Status; } for (Index = 0; Index < HandleCount; Index++) { EFI_DEVICE_PATH_PROTOCOL *DevicePath; Status = gBS->HandleProtocol ( HandleBuffer[Index], &gEfiDevicePathProtocolGuid, (VOID **) &DevicePath ); if (!EFI_ERROR (Status)) { // 找到设备路径,可进一步处理或输出 Print (L"Found device handle: 0x%x\n", HandleBuffer[Index]); } } gBS->FreePool (HandleBuffer); return EFI_SUCCESS; } ``` 该代码通过查找所有安装了 `BlockIo` 协议的句柄,来识别可能的启动设备。实际启动设备通常可以通过 `BootManager` 所选择的启动项来确定,UEFI 提供了 `gEfiLoadOptionBootCurrent` 变量来标识当前启动项的索引,结合 `gBS->OpenProtocol` 和 `gEfiBlockIoProtocolGuid` 可以进一步获取当前启动设备的句柄和协议信息 [^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值