BIOS知识枝桠——Device Path

定义&原型

Device Path: 一种为区分各种设备而命名的地址;在UEFI SPEC中定义了它的数据结构和若干操作它的UEFI Protocol
Prototype:

/**
  This protocol can be used on any device handle to obtain generic path/location
  information concerning the physical device or logical device. If the handle does
  not logically map to a physical device, the handle may not necessarily support
  the device path protocol. The device path describes the location of the device
  the handle is for. The size of the Device Path can be determined from the structures
  that make up the Device Path.
**/
typedef struct {
  UINT8 Type;       ///< 0x01 Hardware Device Path.
                    ///< 0x02 ACPI Device Path.
                    ///< 0x03 Messaging Device Path.
                    ///< 0x04 Media Device Path.
                    ///< 0x05 BIOS Boot Specification Device Path.
                    ///< 0x7F End of Hardware Device Path.

  UINT8 SubType;    ///< Varies by Type
                    ///< 0xFF End Entire Device Path, or
                    ///< 0x01 End This Instance of a Device Path and start a new
                    ///< Device Path.

  UINT8 Length[2];  ///< Specific Device Path data. Type and Sub-Type define
                    ///< type of data. Size of data is included in Length.

} EFI_DEVICE_PATH_PROTOCOL;

Device Path 与其他一些Protocol有些不一样的地方,属于不定长的Protocol,length代表的是整个Device Path的长度本身占两个字节。如果说,type 占一位 subtype占一位,在没有任何其他加入的情况下,length[4]就可满足使用。

Device Path用来在UEFI环境中标识系统中的设备(物理设备或者逻辑设备),类似于在ACPI中用Name Space来标识各个Object。这就意味:1)Device Path也具有层级结构;2)众多Device Path集合起来构成了1个UEFI环境下的设备命名空间。

OS或者UEFI应用根据Device Path来知道它代表的设备。
举个例子:UEFI SPEC中定义了与Console相关的3个variables:ConIn, ConOut, and ErrOut。每个variable的内容都包含1个Device Path,这个Device Path表示每次开机默认使用的用于该种用途(ConIn,ConOut, ErrOut)的Console Device,UEFI应用可以通过这个Device Path来确定对应的Console Device。

UEFI Device Path (1): 重新认识Device Path

在主观而言,机器需要根据输入的硬件设备类型来判定 硬盘 U盘 网络 shell等,以下面的为例
Acpi(PNP0A03,0)/Pci(1F|1)/Ata(Primary,master)/HD(part3,Sig010…)\EFI\Boot"/"OSLoader.efi"
在这里插入图片描述
Acpi(PNP0A03,0):ACPI的一个Root Bridge
/Pci(1F|1):PCI Device 1F|0 代表SATA盘的root port口
/Ata(Primary,master):SATA Device
/HD(part3,Sig010…):HD
\EFI\Boot"/"OSLoader.efi指明路径,\EFI\Boot下的OSLoader.efi

Example 2:Removable USB HDD with MBR partition PciRoot(0x0)/Pci(0x14,0x0)/USB(0x0,0x0)/HD(1,MBR,0x01EDBE02,0x800,0x1004800)

PciRoot(0x0) => 代表Pci Root Bridge扩展出来的Pci总线域,这个是PCI设备的最顶层域,在台式机和笔记本上通常只有1个,其编号为0。

Pci(0x14,0x0) => 代表USB XHCI Controller,其PCI Device=0x14,PCI Function=0x00。PCI Bus因为是会变动的(比如有PCI设备Hot-Plug或者下次启动有PCI设备添加/移除),UEFI SPEC规定其值不纳入Device Path Node,通常结合平台信息可以推断出来PCI Bus的值。

USB(0x0,0x0) => 代表Removable USB HDD, 其接在USB Port 0上。

HD(1,MBR,0x01EDBE02,0x800,0x1004800) => 代表Removable USB HDD上的第1个硬盘分区,为MBR格式。

文本表示形式

EDK2给出了将各种Device Path Node转换成文本形式的实现,具体参考:mUefiDevicePathLibToTextTable defined in edk2\MdePkg\Library\UefiDevicePathLib\DevicePathToText.c.

Device Path Node类型文本格式示例
PCI设备Pci(Dev,Func) Dev-PCI Device NumberFunc-PCI Function NumberPci(0x1C,0x4)
Vendor自定义设备VenHw(GUID[,Data])GUID为Vendor GUID,Data为对应的数据(如存在)VenHw(480B3204-C23C-4AE1-BB16-A73FADDA475F)
ACPI设备 - PCI总线域PciRoot(UID)UID为PCI总线域编号PciRoot(0)
ACPI设备 - 通用形式Acpi(HID,UID)HID,UID定义参考ACPI SPECAcpi(PNP0303,0x0)
IDE设备Ata([PriSec,SlaveMaster,]LUN)相关参数参考UEFI SPEC说明Ata(Primary,Master,0)
USB设备USB(ParentPort,InterfaceNumber)相关参数参考UEFI SPEC说明USB(0x5,0x0)
SATA设备Sata(HBAPort,PortMultiplierPort,LUN)相关参数参考UEFI SPEC说明Sata(0x1,0x0,0x0)
NVMe设备NVMe(NSID,EUI-64)相关参数参考UEFI SPEC说明NVMe(0x1,C3-70-00-00-02-0D-08-00)
硬盘分区HD(PartitionNumber, PartitionFormat,PartitionSig, PartitionStartLBA,PartitionSize)相关参数参考UEFI SPEC说明HD(1, MBR,0x01EDBE02,0x800,0x1004800) HD(1,GPT,425EAA1B-B401-4960-BEFC-5248CA7BCF28,0x800,0x82000)
CD-ROM分区CDROM(BootEntry[,PartitionStartRBA, PartitionSize])相关参数参考UEFI SPEC说明
MAC地址MAC(MACAddr, NICInterface)相关参数参考UEFI SPEC说明MAC(54E1AD76ACEB,0x0)
IPv4地址IPv4(RemoteIPAddr[, Protocol,Static/DHCP,LocalI PAddr,GatewayIPAddr,SubnetMask])相关参数参考UEFI SPEC说明IPv4(0.0.0.0)
IPv6地址IPv6(RemoteIPAddr[,Protocol, IpAddressOrigin,LocalI PAddr,GatewayIPAddr,SubnetMask])相关参数参考UEFI SPEC说明IPv6(0000:0000:0000:0000:0000:0000:0000:0000)
UEFI固件分区Fv(FvGUID)相关参数参考UEFI SPEC说明Fv(A881D567-6CB0-4EEE-8435-2E72D33E45B5)

EFI Device Path种类

  • Hardware Device Path 01
  • ACPI Device Path 02
  • Messaging Device Path 03
  • Media Device Path 04
  • BIOS Boot Specification Device Path 05
  • End of Hardware Device Path 7F

设备路径节点主要有六种类型:

  • 硬件设备路径Hardware Device Path。此设备路径定义了设备如何连接到系统的资源域,其中资源域就是系统的共享内存、内存映射的I/O和I/O空间,可以有多个级别的硬件设备路径,例如连接到PCCARD PCI控制器的PCCARD设备。。
  • ACPI设备路径ACPI Device Path。此设备路径用于描述未以行业标准方式描述枚举的设备。这些设备必须在ACPI名称空间中使用ACPI AML进行描述;“设备路径”是ACPI名称空间的链接。
  • 通讯设备路径Messaging Device Path。“设备路径”用于描述系统资源域外的设备对接情况。此设备路径可以描述物理消息传递信息(如SCSI ID)或抽象信息(如网络protocolIP地址)。
  • 媒体设备路径Media Device Path。此设备路径用于描述引导服务正在抽象的介质部分。例如,Media Device Path可以定义正在使用硬盘驱动器上的哪个分区。
  • BIOS启动规格设备路径BIOS Boot Specification Device Path。此设备路径用于指向引导legacy操作系统;它基于BIOS Boot Specification Version 1.01。关于获得此规格的详细信息,请参阅UEFI SPEC 附录Q。
  • End of Hardware Device Path硬件设备路径结束。根据子类型,此“设备路径”节点用于表示“设备路径”实例或“设备路径”结构的结束。

Hardware Device Path

在这里插入图片描述

“ Vendor Device Path”允许创建厂商定义的设备路径。厂商必须为设备路径分配一个厂商GUID。然后可以使用Vendor GUID定义Vendor Device Path节点后面n个字节上的内容。

ACPI Device Path

该设备路径包含ACPI设备ID,表示设备即插即用硬件ID及其对应的唯一持久ID。ACPI id存储在与设备相关联的ACPI _HID、_CID和_UID设备标识对象中。ACPI设备路径包含的值必须与平台固件提供给操作系统的ACPI名称空间精确匹配。对_HID、_CID和_UID设备标识对象的完整描述请参见ACPI规范。

_HID和_CID是可选的设备标识对象,出现在ACPI名称空间中。如果只有_HID, _HID必须用于描述ACPI驱动枚举的任何设备。_CID,如果存在,包含OS附加通用驱动程序(例如,PCI总线驱动程序)的重要信息,而_HID包含OS附加设备特定驱动程序的重要信息。当一个设备没有标准的总线枚举器时,ACPI总线驱动程序才会枚举该设备。

_UID对象为操作系统提供序列号样式的设备ID,该设备不会在重新启动时发生改变。该对象是可选的,但当系统包含两个报告相同_HID的设备时是必需的。_UID只需要在具有相同_HID值的所有设备对象中是唯一的。如果_HID的APCI名称空间中不存在_UID,那么ACPI设备路径的_UID字段中必须存储0。

“ACPI设备路径”仅用于描述未被“硬件设备路径”定义的设备。由于PCI规范没有定义PCI根桥的编程模型,所以需要一个_HID(如果有_CID)来表示PCI根桥。ACPI设备路径有两种子类型:一种是简单子类型,只包括_HID和_UID字段,另一种是扩展子类型,包括_HID、_CID和_UID字段。

MnemonicByte OffsetByte LengthDescription
Type01Type 2 – ACPI Device Path.
Sub-Type11Sub-Type 1 ACPI Device Path.
Length22该结构的长度为12字节
_HID44设备的PnP硬件ID存储在一个数字32位压缩的eisa类型ID中。该值必须与ACPI名称空间中相应的_HID匹配。
_UID84如果两个设备有相同的_HID, ACPI需要的唯一ID。该值还必须与ACPI名称空间中相应的_UID/_HID对匹配。只支持32位的数值类型_UID;因此字符串不能用于ACPI名称空间中的_UID。

Messaging Device Path

Media Device Path

在这里插入图片描述
“Hard Drive Media Device Path”用于表示硬盘上的一个分区。每个分区至少有Hard Drive Device Path节点,每个节点描述分区表中的一个entry。EFI支持MBR和GPT分区格式。分区根据它们在各自分区表中的条目编号,从1开始。分区在EFI中从LBA 0开始寻址。0的分区号可以用来表示原始硬盘驱动器或原始扩展分区。

“CD-ROM Media Device Path”用于定义CD-ROM上存在的系统分区。假设CD-ROM包含ISO-9660文件系统,并遵循CD-ROM El Torito格式。

BIOS Boot Specification Device Path

“设备路径”用于描述非efi感知操作系统的引导过程。该设备路径基于BIOS启动规范附录A中定义的IPL和BCV表项数据结构。BIOS Boot Specification Device Path定义了一个完整的设备路径,不与其他设备路径项一起使用。此设备路径仅用于使平台固件选择一个legacy的非efi OS作为启动选项。

End of Hardware Device Path

设备路径由“硬件设备路径结束”节点终止。这种类型的节点有两个子类型

结束设备路径实例(子类型0x01)。这种类型的节点终止一个设备路径实例,并表示另一个设备路径实例的开始。只有当一个环境变量代表多个设备时才需要这样做。这方面的一个例子是ConsoleOut环境变量,它由VGA控制台和串行输出控制台组成。这个变量将描述一个同时发送到VGA和串行的控制台输出流,因此具有一个包含两个完整设备路径的设备路径。

结束整个设备路径(子类型0xFF)。这种类型的节点终止整个设备路径。软件搜索此子类型以找到设备路径的结束。所有设备路径必须以此子类型结束

EFI_DEVICE_PATH_TYPE
0x7F END_DEVICE_PATH_TYPE0xFF END_ENTIRE_DEVICE_PATH_SUBTYPEUINT8 Length[2]
0x7F END_DEVICE_PATH_TYPE0xFF END_INSTANCE_DEVICE_PATH_SUBTYPEUINT8 Length[2]
  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值