我正在閱讀FreeBSD uefi bootloader。但是有一部分我無法理解Block I/O Protocol。我引用了源代碼。如何在我的uefi bootloader中使用塊I/O協議
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);
我不認爲這是準確的。據我所知,設備路徑節點不包含句柄。通過使用設備路徑協議(如問題中的代碼)從句柄獲取設備路徑。 –
是的,我的陳述在科學上不正確! DP節點不包含描述設備或其部分的句柄。 DP可能只有一個節點,您可以從該DP獲取句柄。你可以同時使用兩種方式:從句柄中獲取DP或反過來從設備路徑(可以自行構建)或從其中獲取句柄。例如,您可以將DP用於邏輯分區,並將DP分成可以分區處理的部分,整個HDD,AHCI控制器等。 – Alex