如何在我的 uefi 引导加载程序中使用 block i/o 协议
how to use block i/o protocol in my uefi bootloader
我正在阅读 FreeBSD uefi 引导程序。但是关于Block I/O Protocol.I quote source code.
有一部分我无法理解
status = systab->BootServices->LocateHandle(ByProtocol,
&BlockIoProtocolGUID, NULL, &nparts, handles);
nparts /= sizeof(handles[0]);
for (i = 0; i < nparts; i++) {
status = systab->BootServices->HandleProtocol(handles[i],
&DevicePathGUID, (void **)&devpath);
if (EFI_ERROR(status))
continue;
while (!IsDevicePathEnd(NextDevicePathNode(devpath)))
devpath = NextDevicePathNode(devpath);
status = systab->BootServices->HandleProtocol(handles[i],
&BlockIoProtocolGUID, (void **)&blkio);
if (EFI_ERROR(status))
continue;
if (!blkio->Media->LogicalPartition)
continue;
if (domount(devpath, blkio, 1) >= 0)
break;
}
为什么如下代码在搜索设备路径结束?
while (!IsDevicePathEnd(NextDevicePathNode(devpath)))
devpath = NextDevicePathNode(devpath);
看起来代码想要查看设备路径的最后一个节点,因此它跳过所有节点,直到到达结束节点之前的节点。
只想对 haggai_e 所说的内容进行补充。 DP(设备路径)是一个简单的链表,其中每个节点代表对 UEFI 环境中物理或逻辑设备的某种描述。您可能知道 UEFI 中的每个设备都是一个句柄。因此,遍历 DP 并获取特定节点的句柄可为您提供 DP 描述的特定设备的句柄。
我正在阅读 FreeBSD uefi 引导程序。但是关于Block I/O Protocol.I quote source code.
有一部分我无法理解status = systab->BootServices->LocateHandle(ByProtocol,
&BlockIoProtocolGUID, NULL, &nparts, handles);
nparts /= sizeof(handles[0]);
for (i = 0; i < nparts; i++) {
status = systab->BootServices->HandleProtocol(handles[i],
&DevicePathGUID, (void **)&devpath);
if (EFI_ERROR(status))
continue;
while (!IsDevicePathEnd(NextDevicePathNode(devpath)))
devpath = NextDevicePathNode(devpath);
status = systab->BootServices->HandleProtocol(handles[i],
&BlockIoProtocolGUID, (void **)&blkio);
if (EFI_ERROR(status))
continue;
if (!blkio->Media->LogicalPartition)
continue;
if (domount(devpath, blkio, 1) >= 0)
break;
}
为什么如下代码在搜索设备路径结束?
while (!IsDevicePathEnd(NextDevicePathNode(devpath))) devpath = NextDevicePathNode(devpath);
看起来代码想要查看设备路径的最后一个节点,因此它跳过所有节点,直到到达结束节点之前的节点。
只想对 haggai_e 所说的内容进行补充。 DP(设备路径)是一个简单的链表,其中每个节点代表对 UEFI 环境中物理或逻辑设备的某种描述。您可能知道 UEFI 中的每个设备都是一个句柄。因此,遍历 DP 并获取特定节点的句柄可为您提供 DP 描述的特定设备的句柄。