0

我正在阅读 FreeBSD uefi 引导程序。但是关于 Block I/O Protocol 有一部分我无法理解。我引用了源代码。

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);
4

2 回答 2

1

看起来代码想要查看设备路径的最后一个节点,因此它会跳过所有节点,直到到达结束节点之前的节点。

于 2015-08-17T04:02:38.663 回答
0

只是想补充一点haggai_e所说的内容。DP(设备路径)是一个简单的链表,其中每个节点代表 UEFI 环境中物理或逻辑设备的某种描述。您可能知道 UEFI 中的每个设备都是一个句柄。因此,遍历 DP 并获取特定节点的句柄为您提供了 DP 描述的特定设备的句柄。

于 2015-08-17T16:49:50.890 回答