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 に答える