天天看點

UEFI Spec chapter10 protocols-Device Path Protocol前言一、Device Path Overview二、EFI Device Path Protocol

前言

本節包含裝置路徑協定的定義,以及在UEFI環境中建構和管理裝置路徑所需的資訊。固件構造并使用裝置路徑來傳遞重要裝置的位置,如引導裝置和控制台,這與系統的軟體可見拓撲結構一緻。

提示:以下是本篇文章正文内容,下面案例可供參考

一、Device Path Overview

裝置路徑用于定義到裝置的程式設計路徑。裝置路徑的主要目的是允許應用程式(比如OS加載程式)确定接口要抽象的實體裝置。

裝置路徑的集合通常稱為名稱空間。例如,ACPI是基于用ASL (ACPI源語言)編寫的名稱空間。如果EFI不取代ACPI,并且在可能的情況下服從ACPI,那麼在EFI中利用ACPI名稱空間似乎是合理的。但是,ACPI名稱空間是為在作業系統運作時使用而設計的,不太适合平台固件或OS加載程式。是以,EFI定義了自己的名稱空間,稱為裝置路徑。

裝置路徑被設計成最大限度地利用ACPI名稱空間。裝置路徑中的一個關鍵結構定義了回ACPI名稱空間的連結。裝置路徑還用于填補ACPI遵循标準枚舉算法總線的空白。裝置路徑能夠通過标準枚舉機制将有關總線上正在使用哪個裝置的資訊關聯起來。裝置路徑也用來定義媒體中檔案的位置,或者檔案是從哪裡加載的。裝置路徑的一個特殊情況也可以用來支援從傳統媒體啟動傳統作業系統的可選啟動。

裝置路徑的設計是為了讓OS加載程式和作業系統能夠知道平台固件使用哪些裝置作為引導裝置。這允許作業系統維護與平台固件一緻的系統視圖。這方面的一個例子是“無頭”系統,它使用網絡連接配接作為引導裝置和控制台。在這種情況下,固件将向作業系統傳遞網絡擴充卡和網絡協定資訊,這些資訊在這些裝置的裝置路徑中用作控制台和引導裝置。

二、EFI Device Path Protocol

1.EFI_DEVICE_PATH_PROTOCOL

可以在任何裝置句柄上使用,以擷取有關實體裝置或邏輯裝置的通用路徑/位置資訊。如果句柄在邏輯上沒有映射到實體裝置,那麼句柄可能不一定支援裝置路徑協定。裝置路徑描述了句柄所在的裝置位置。裝置路徑的大小可以由組成裝置路徑的結構來确定。

GUID
#define EFI_DEVICE_PATH_PROTOCOL_GUID \
 {0x09576e91,0x6d3f,0x11d2,\
  {0x8e,0x39,0x00,0xa0,0xc9,0x69,0x72,0x3b}}
Protocol Interface Structure
//*******************************************************
// EFI_DEVICE_PATH_PROTOCOL
//*******************************************************
typedef struct _EFI_DEVICE_PATH_PROTOCOL {
 UINT8 Type;
 UINT8 SubType;
 UINT8 Length[2];
} EFI_DEVICE_PATH_PROTOCOL;
           

執行UEFI Image可以使用裝置路徑将自己的裝置驅動程式比對到特定的裝置。注意,執行UEFI OS加載程式和UEFI應用程式映像必須通過BootServices裝置句柄通路所有實體裝置,直到成功調用EFI_BOOT_SERVICES.ExitBootServices()。UEFI驅動程式隻能通路它提供功能的實體裝置。 

三、Device Path Nodes

裝置路徑節點主要有六種類型:

•硬體裝置路徑。這個裝置路徑定義了一個裝置是如何連接配接到一個系統的資源域的,其中資源域是簡單的共享記憶體,記憶體映射I/O和系統的I/O空間。

•ACPI裝置路徑。此裝置路徑用于描述未以行業标準方式描述枚舉的裝置。這些裝置必須在ACPI名稱空間中使用ACPI AML進行描述;這個裝置路徑是一個到ACPI名稱空間的連結。

•消息傳遞裝置路徑。此裝置路徑用于描述系統資源域以外的裝置對接。該裝置路徑可以描述實體消息資訊(如SCSI ID),或抽象資訊(如網絡協定IP位址)。

•媒體裝置路徑。該裝置路徑用于描述被引導服務抽象的媒體部分。例如,Media Device Path可以定義正在使用硬碟驅動器上的哪個分區。

•BIOS引導規範裝置路徑。此裝置路徑用于指向引導傳統作業系統;它基于BIOS Boot Specification Version 1.01。關于獲得該規範的詳細資訊,請參閱附錄Q。

•結束硬體裝置路徑。根據子類型的不同,該裝置路徑節點用于訓示裝置路徑執行個體或裝置路徑結構的結束。

UEFI SPEC一共定義了6個大類(Type)的Device Path Node,每個大類下面又分不同的子類(Sub-Type)。大類劃分參考下面表格,子類的劃分比較繁雜不便一一展開,請直接參考UEFI SPEC。

大類 可表示的典型裝置/對象
Hardware Device Path PCI裝置,Vendor自定義裝置,BMC
ACPI Device Path

PCI總線域(如上面的PciRoot(0x0))

顯示輸出裝置,ACPI裝置(比如滑鼠/鍵盤等)

Messaging Device Path IDE裝置,USB裝置,SATA裝置,SAS裝置,SCSI裝置,UART裝置,Vendor自定義對象,MAC位址,IPv4/IPv6位址,其他新興裝置
Media Device Path 硬碟分區,CDROM分區,Vendor自定義Media,檔案路徑,UEFI固件分區,UEFI固件檔案,RAM Disk
BIOS Boot Specification Device Path 傳統的BIOS啟動裝置
End of Hardware Device Path Device Path終結符

1. Generic Device Path Structures

裝置路徑是一個變長二進制結構,由變長通用裝置路徑節點組成。表10-1定義了可變長度通用裝置路徑節點的結構及其元件的長度。該表定義了10.3節中描述的裝置路徑對應的類型和子類型值;其他類型和子類型均為“保留”。

UEFI Spec chapter10 protocols-Device Path Protocol前言一、Device Path Overview二、EFI Device Path Protocol

一個裝置路徑是一系列通用的裝置路徑節點。第一個裝置路徑節點從裝置路徑的位元組偏移量0開始。下一個裝置路徑節點從上一個裝置路徑節點的末尾開始。是以,所有節點都是位元組打包的資料結構,可能出現在任何位元組邊界上。所有對裝置路徑注釋的代碼引用必須假設所有字段都是不對齊的。由于每個裝置路徑節點都在已知位置包含長度字段,是以可以周遊未知類型的裝置路徑節點。裝置路徑中節點的數量、類型和順序沒有限制。

裝置路徑由“硬體裝置路徑結束”節點終止。這種類型的節點有兩個子類型(見表10-2):

•結束該裝置路徑執行個體(子類型0x01)。這種類型的節點終止一個裝置路徑執行個體,并表示另一個的開始。隻有當環境變量表示多個裝置時才需要這樣做。這方面的一個例子是由VGA控制台和串行輸出控制台組成的ConsoleOut環境變量。這個變量将描述一個控制台輸出流,它同時被發送到VGA和串行,是以有一個包含兩個完整裝置路徑的裝置路徑。

•結束整個裝置路徑(子類型0xFF)。這種類型的節點終止整個裝置路徑。軟體搜尋此子類型以找到裝置路徑的結尾。所有“裝置路徑”必須以該子類型結尾。

UEFI Spec chapter10 protocols-Device Path Protocol前言一、Device Path Overview二、EFI Device Path Protocol