2015-08-16 50 views
0

我正在閱讀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); 

回答

0

只是想添加一點什麼haggai_e說。 DP(設備路徑)是一個簡單的鏈接列表,其中每個節點代表UEFI環境中物理或邏輯設備的描述。而且您可能知道UEFI中的每個設備都是一個句柄。因此,通過DP進行遍歷並獲取特定節點的句柄,可以讓您掌握DP描述的特定設備。

+0

我不認爲這是準確的。據我所知,設備路徑節點不包含句柄。通過使用設備路徑協議(如問題中的代碼)從句柄獲取設備路徑。 –

+0

是的,我的陳述在科學上不正確! DP節點不包含描述設備或其部分的句柄。 DP可能只有一個節點,您可以從該DP獲取句柄。你可以同時使用兩種方式:從句柄中獲取DP或反過來從設備路徑(可以自行構建)或從其中獲取句柄。例如,您可以將DP用於邏輯分區,並將DP分成可以分區處理的部分,整個HDD,AHCI控制器等。 – Alex

1

它看起來像代碼要看看設備路徑的最後一個節點,所以直到到達最終節點之前的一個會跳過所有節點。