UEFI Device Path (1): 重新认识Device Path
从事UEFI开发的人员,对UEFI Device Path的概念都有一定了解,但未必都建立了比较系统而深刻的认识。UEFI Device Path的认知仅限于: 1)它是用来表示系统中设备的路径;2) 在UEFI SPEC中定义了它的数据结构和若干操作它的UEFI Protocol。除此以外, 我对它的相关方面似乎没有更多更深的了解, 包括:
UEFI为什么要提出Device Path的设计?
Device Path可以表示哪些设备? 是如何表示的?
Device Path有哪些实际应用? 最为常见的一个应用就是:进入UEFI Shell后会自动提示如下 Mapping Table, 其中每个FSx或BLKx下面都对应一行Device Path, 如何解读它们呢?
这两天趁着春节的空闲,我重新翻看了UEFI SPEC并下载EDK2 Source Code进行相关编程实验,从理论和实践方面加深了对Device Path的一些认识。这些认识基本围绕上述3个方面来展开,在此汇总成篇。
1.UEFI为什么要提出Device Path的设计?
这里援引UEFI SPEC中关于Device Path用途说明的几个关键句子:
The primary purpose of a Device Path is to allow an application, such as an OS loader, to determine the physical device that the interfaces are abstracting.
A collection of device paths is usually referred to as a name space.
However, the ACPI name space was designed for usage at operating system runtime and does not fit well in platform firmware or OS loaders. Given this, EFI defines its own name space, called a Device Path.
A Device Path is designed to make maximum leverage of the ACPI name space.
对此,我个人的理解和认识是:
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。
Device Path在设计上充分利用了已有的ACPI Name Space的命名设计。关于这一点参考下面“Device Path与ACPI的联系”一节。
2.Device Path可以表示哪些设备? 是如何表示的?
Device Path的组织结构
Device Path以Device Path Node为基本单位来依次串接而成,其结束标志是End of Hardware Device Path类型的Device Path Node。下图展示了Device Path Node的基本结构:
每个Device Path Node代表某一层级的域/设备或者设备属性(比如MAC地址/IPv4地址/IPv6地址等)。通常来说,它们会按照各自所处的Subsystem的拓扑结构至顶向下来排列形成最终Device Path,从而代表了设备的拓扑路径。下面,以开篇的UEFI Shell下的Device Path为例来说明。
Example 1: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格式。
Example 2:NVMe SSD with GPT partition PciRoot(0x0)/Pci(0x1C,0x4)/Pci(0x0,0x0)/NVMe(0x1,C3-70-00-00-02-0D-08-00)/HD(1,GPT,425EAA1B-B401-4960-BEFC-5248CA7BCF28,0x800,0x82000)
PciRoot(0x0) => 意义同上。
Pci(0x1C,0x4) => 代表NVMe SSD所在的PCIe Root Port,其PCI Device=0x1C,PCI Function=0x04。
Pci(0x0,0x0) => 代表NVMe SSD Controller, 其PCI Device=0x0,PCI Function=0x0。
NVMe(0x1,C3-70-00-00-02-0D-08-00) => 代表NVMe的Name Space, 用该Name Space来标识NVMe SSD设备。
HD(1,GPT,425EAA1B-B401-4960-BEFC-5248CA7BCF28,0x800,0x82000) => 代表NVMe SSD上的第1个硬盘分区,为GPT格式。
Device Path的类别
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终结符
Device Path的文本表示形式
UEFI定义了相关的Protocol来将Device Path的数据结构转换为可视化的文本形式。下面给出几种常见Devie Path Node类型的文本形式。
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 Number Pci(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 SPEC Acpi(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,LocalIPAddr,GatewayIPAddr,SubnetMask])
相关参数参考UEFI SPEC说明 IPv4(0.0.0.0)
IPv6地址 IPv6(RemoteIPAddr[,Protocol,IpAddressOrigin,LocalIPAddr,GatewayIPAddr,SubnetMask])
相关参数参考UEFI SPEC说明 IPv6(0000:0000:0000:0000:0000:0000:0000:0000)
UEFI固件分区 Fv(FvGUID)
相关参数参考UEFI SPEC说明 Fv(A881D567-6CB0-4EEE-8435-2E72D33E45B5)
Device Path与ACPI的联系
从上一节可以看到,ACPI Device Path类别的Device Path Node是沿用ACPI命名设计的。在Acpi(HID,UID)形式中,HID是APCI定义的"UUUNNNN"形式的HID字符串,UID也与APCI定义完全相同。
3.如何解读UEFI Shell下Mapping Table中的Device Path?
在“Device Path的组织结构”一节中已经解析过开篇提到的UEFI Shell下的Device Path了,这里补充说一下我对FSx和BLKx是如何进行映射的理解。
具体实现可以参考UEFI Shell在EDK2中的源码:ShellCommandCreateInitialMappingsAndPaths() defined in edk2\ShellPkg\Library\UefiShellCommandLib\UefiShellCommandLib.c.
详细的代码实现逻辑非常复杂,这里只挑几个要点陈述如下:
FSx的映射
1.先找到Support EFI_SIMPLE_FILE_SYSTEM_PROTOCOL的所有Device Handle,每个Device Handle代表1个File System,会被分配1个FSx:。
2.对上述每个Device Handle Locate到其Device Path,转换为Device Path Text,按Text String由小到大的顺序进行排序,对应的Device Handle的FSx从0开始依次编号。
BLKx的映射
1.先找到Support EFI_BLOCK_IO_PROTOCOL的所有Device Handle,每个Device Handle代表1个Block设备,会被分配1个BLKx:。
2.对上述每个Device Handle Locate到其Device Path,转换为Device Path Text, 按Text String由小到大的顺序进行排序,对应的Device Handle的BLKx从0开始依次编号。
3.如上述Device Handle与FSx映射中的Device Handle是同1个,则在对应的FSx:右侧标注对应的BLKx:。
相关文章:
UEFI Device Path (1): 重新认识Device Path
从事UEFI开发的人员,对UEFI Device Path的概念都有一定了解,但未必都建立了比较系统而深刻的认识。UEFI Device Path的认知仅限于: 1)它是用来表示系统中设备的路径;2) 在UEFI SPEC中定义了它的数据结构和若干操作它的UEFI Protocol。除此以外…...
合成孔径成像的应用及发展
一、引言 合成孔径成像自20世纪50年代提出,应用于雷达成像,历经70年的研发,已经日趋成熟,成功地用于环境资源监测、灾害监测、海事管理及军事等领域。受物理环境制约,合成孔径在声呐成像中的研发与应用起步稍迟&#…...
MyBatis-Plus的基本操作
目录 1、配置文件 1、添加依赖 2、启动类 3、实体类 4、添加Mapper类 5、测试Mapper接口 2、CRUD测试 1、insert添加 2、修改操作 3、删除操作 3、MyBatis-Plus条件构造器 4、knife4j 1、Swagger介绍 2、集成knife4j 3.添加依赖 4 添加knife4j配置类 5、 Cont…...
HTTPAPI使用
1、使用浏览器 1.1、获取当前IP(限制 1200次 /小时) 用浏览器访问 http://ip.hahado.cn/current-ip 输入用户名和密码 [{"ip": "180.102.181.64","ttl": 262.87515091896057} ] "ip": 字段是当前的外网IP ("ip&qu…...
Windos下设置java项目开机自启动
这里是将java项目注册为Windows服务实现开机自启动。 查看.NET framework版本 因为使用winsw工具运行时需要使用.NET framework,基本上现在的win10系统带自带有.NET framework4.0,为了选择合适的版本,我们可以查看本机.NET Framework版本,根…...
(链表)移除链表元素(双指针法)
文章目录前言:问题描述:解题思路(双指针法):代码实现:总结:前言: 此篇是针对链表的经典练习题。 问题描述: 给你一个链表的头节点 head 和一个整数 val ,请…...
Raft协议
文章目录一、目的(与Paxos相同)二、名字来源三、服务器状态四、基本实现1、任期2、RPC调用3、领导者选举4、日志复制5.领导者更替三、Raft与Paxos的区别1.表现形式2.简单性3.领导选举算法一、目的(与Paxos相同) 保证日志完全相同…...
动态规划概述
动态规划概述动态规划的两个要求: 1.最优子结构 例:现有一座10级台阶的楼梯,我们要从下往上走,每次只能跨一步,一步可以往上走1级或者2级台阶,请问一共有多少种解法呢? 台阶数12345678910走法数…...
CPU缓存架构+Disruptor内存队列
文章目录CPU缓存架构Disruptor内存队列CPU缓存架构介绍缓存一致性问题缓存一致性协议MESI协议伪共享问题高性能内存队列DisruptorCPU缓存架构Disruptor内存队列 CPU缓存架构 介绍 cpu与内存的交互数据之间,有一个高速缓存层。有些处理器有3层缓冲,有些…...
Spark SQL join操作详解
一、 数据准备 本文主要介绍 Spark SQL 的多表连接,需要预先准备测试数据。分别创建员工和部门的 Datafame,并注册为临时视图,代码如下: val spark SparkSession.builder().appName("aggregations").master("lo…...
设计模式-day04
5,结构型模式 5.6 组合模式 5.6.1 概述 对于这个图片肯定会非常熟悉,上图我们可以看做是一个文件系统,对于这样的结构我们称之为树形结构。在树形结构中可以通过调用某个方法来遍历整个树,当我们找到某个叶子节点后,…...
线段树的学习(2023.4.5)
今天我来学习线段树 首先它是树有着树的结构,线段树由于本身是专门用来处理区间问题的 它的作用可以处理区间的问题拥有更快的速度. 对于每一个子节点而言,都表示整个序列中的一段子区间;对于每个叶子节点而言,都表示序列中的单个元素信息…...
Java 实现excel、word、txt、ppt等办公文件在线预览功能
相信大家在开发的过程中都会遇到在线预览功能,有没有想过如何通过java来实现excel、word、txt、ppt等办公文件在线预览功能?今天我们就来解决这一疑问! 其实,网上还是有些公司对这一功能提供了收费服务。那么,如何实现…...
《Vue3实战》 第九章 路由
1、安装路由 cnpm install vue-router42、router-link应用 2.1、创建views/OrderList.vue组件 <template> <h1>订单列表页面......</h1> </template> <script> export default{name: OrderList,data(){return{arr:[4,2,5]} } …...
ToBeWritten之物联网Zigbee协议
也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 转移发布平台通知:将不再在CSDN博客发布新文章,敬…...
【万象奥科】RZ/G2UL网关内存压力测试
测试目的 内存压力测试的目的是测试系统内存的稳定性和可靠性,以便确定系统是否能够在各种负载情况下正常运行。其主要目的有: 测试内存的正确性:通过模拟各种内存负载情况,例如写入随机数据、重复写入相同数据、使用指定的模式…...
C++中的继承
面向对象的三大特性 封装继承多态 继承的概念和定义 继承的本质就是类层次的复用。 继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段.它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类…...
SpringRetry接口异常优雅重试机制
场景: 某些场景下,如果接口出现异常需要进行重试,例如网络抖动、调用接口超时等并非接口代码导致的报错,此时可以进行接口重试机制 1、导入 spring retry 重试依赖 <!-- spring retry --><dependency><groupId>…...
2023年全国最新高校辅导员精选真题及答案46
百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 27.充沛的精力和顽强的毅力是教师意志品质的体现。 答案:正确 28.规范与约束…...
程序员为了女朋you进了华为,同学去了阿里,2年后对比收入懵了
什么样的工作才是好工作?每当遇到这个问题,我们的答案总是出奇的一致:钱多事少离家近。 然而现实总是残酷的,日前,有网友在某社交论坛发帖称:自己为了女朋友留在了成都进入华为工作,而自己的同…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
