PCIe从入门到精通之十三:PCIe设备Vender ID, Device ID, Subsystem Vendor ID, Subsystem ID的区别
0,引言
在上一篇文章《PCIe从入门到精通之十二:PCIe设备的配置空间详解2》中,我们介绍了PCIe配置空间前0x3F个寄存器(header)以及Type0和Type1的不同部分。在这一篇文章中我们继续介绍PCIe配置空间中PCIe设备Vender ID, Device ID, Subsystem Vendor ID, Subsystem ID的区别。
所有PCIe主题的文章都会收录在《深入浅出聊PCIe》合集里,欢迎评阅。
需要下载PCIe学习资料标准的朋友(pdf格式),请关注本微信公众号“硬件工程师宝典”,在对话框内回复“PCIe”,将获取标准下载链接。
一, PCIe device四个ID
PCIe Type0设备(Endpoint)使用一套多级的ID系统来唯一标识硬件,这有助于操作系统正确识别设备、加载相应的驱动程序以及区分不同制造商或同一制造商的不同产品。入下图所示,这四个主要的ID分别是:
|
ID Name |
Offset |
Usage |
|
Vendor ID |
Offset (00h-01h) |
供应商ID |
|
Device ID |
Offset (02h-03h) |
设备ID |
|
Subsystem Vendor ID |
Offset (2Ch-2Dh) |
子系统供应商ID |
|
Subsystem ID |
Offset (2Eh-2Fh) |
子系统ID |

1. Vendor ID (供应商ID)
- 定义: 一个16位的标识符,由PCI SIG (PCI Special Interest Group) 分配给每个PCI/PCIe芯片制造商。
查询网址:https://pcisig.com/membership/member-companies
- 用途: 唯一标识芯片的原始制造商。无论该制造商生产什么类型的PCIe芯片,其Vendor ID都是固定的。
- 例子:
- Intel: 0x8086
- NVIDIA: 0x10DE
- AMD: 0x1002
- 作用: 操作系统和驱动程序首先通过Vendor ID来确定芯片的生产商,这是芯片识别的第一步。
2. Device ID (设备ID)
- 定义: 一个16位的标识符,由芯片的原始制造商(由Vendor ID标识)为其生产的每种特定芯片类型分配。
- 用途: 唯一标识特定供应商生产的某种特定型号或功能的产品。
- 例子:
- Intel (Vendor ID 0x8086) 的某个特定网卡芯片可能有 Device ID 0x15BB。
- NVIDIA (Vendor ID 0x10DE) 的某个特定GPU芯片可能有 Device ID 0x1C81。
- 作用: 与Vendor ID结合使用,Vendor ID:Device ID 组合可以唯一标识一个特定的芯片或功能单元。驱动程序通常会根据这个组合来加载。
3. Subsystem Vendor ID (子系统供应商ID)
- 定义: 一个16位的标识符,与主芯片的Vendor ID相同,由PCI SIG分配。但它用于标识制造或销售包含主PCIe芯片的完整板卡(子系统)的制造商。
- 用途: 当一个芯片制造商(由Vendor ID和Device ID标识)将其芯片销售给其他板卡制造商,由这些板卡制造商集成到自己的产品中时,Subsystem Vendor ID就用来标识这个最终的板卡制造商。
- 例子: 如果NVIDIA (Vendor ID 0x10DE) 生产了一个GPU芯片 (Device ID 0x1C81),然后华硕 (ASUS) 购买这个芯片并制造了一张显卡。那么这张显卡的:
- Vendor ID: 0x10DE (NVIDIA)
- Device ID: 0x1C81 (NVIDIA的某个GPU型号)
- Subsystem Vendor ID: 0x1043 (华硕的Vendor ID)
- 作用: 区分使用相同主芯片但由不同板卡制造商生产的设备。这对于驱动程序来说很重要,因为即使主芯片相同,不同板卡制造商可能会有不同的BIOS、散热解决方案、接口布局或附加功能,可能需要特定的驱动版本或配置。
4. Subsystem ID (子系统ID)
- 定义: 一个16位的标识符,由子系统供应商(由Subsystem Vendor ID标识)为其生产的每种特定板卡型号分配。
- 用途: 唯一标识特定子系统供应商生产的特定型号的板卡。
- 例子: 延续上面的例子,华硕 (Subsystem Vendor ID 0x1043) 可能会为使用NVIDIA 0x1C81 GPU的某个特定型号显卡分配一个 Subsystem ID,例如 0x8670。
- 作用: 与Subsystem Vendor ID结合使用,Subsystem Vendor ID:Subsystem ID 组合可以唯一标识一个完整的PCIe板卡产品。这允许驱动程序针对特定板卡的具体特性进行优化或提供支持。
区别总结
|
ID类型 |
长度 |
分配者 |
标识对象 |
主要用途 |
|
Vendor ID |
16位 |
PCI SIG |
设备的原始芯片制造商 |
识别芯片制造商 |
|
Device ID |
16位 |
芯片制造商 |
芯片制造商生产的特定芯片型号或功能 |
与Vendor ID组合,识别特定芯片/功能 |
|
Subsystem Vendor ID |
16位 |
PCI SIG |
集成芯片并制造完整板卡的制造商 |
识别最终板卡制造商 |
|
Subsystem ID |
16位 |
板卡制造商 |
板卡制造商生产的特定完整板卡型号 |
与Subsystem Vendor ID组合,识别特定板卡产品,用于定制驱动 |
简而言之:
- Vendor ID:Device ID 标识的是核心芯片是什么,由芯片设计公司提供。
- Subsystem Vendor ID:Subsystem ID 标识的是最终产品板卡是什么,由板卡生产商提供。
这种分层标识系统允许硬件和软件生态系统更精确地识别和管理PCIe设备,尤其是在芯片被多个第三方集成到不同产品中的情况下。
二,总结和实战
- 总结
总而言之,Vender ID和Device ID表示的是芯片的信息;Subsystem Vendor ID和Subsystem ID表示的是板子制造商的信息。
所有的ID对应信息可以在PCI-SIG提供的汇总表中查询的到。
https://pci-ids.ucw.cz/v2.2/pci.ids
- Linux下如何查看这四个PCIe ID
下图是PCIe Spec中给出的这四个ID在寄存器中的位置。

下图是从一个实际系统中读出的值:

注:原图来源于网络,作了适当的修改。
- 图中,VID=8086,众所周知这个VID是给英特尔的;DID=9C43,这是一个8 Series LPC Controller,在PCI-SIG的汇总表查询如下图示;

- 图中,Sub VID=17aa,这是一个ThinkServer, Sub DID=3978是它家的一个板子。
- Windows下如何查看这四个PCIe ID
通过设备管理器 (Device Manager)
这是最常用且直接的方法,适用于大多数设备。
步骤:
- 右键点击“此电脑”(或“我的电脑”),选择“管理”。
- 在左侧导航栏中,选择“设备管理器”。
- 找到您想要查看的设备。设备通常按类型分类(例如,“显示适配器”、“网络适配器”、“通用串行总线控制器”等)。
- 右键点击该设备,然后选择“属性”。
- 在“属性”窗口中,切换到“详细信息”选项卡。
- 在“属性”下拉菜单中,选择“硬件 ID”(Hardware IDs)。
- 在“值”框中,您会看到类似 PCI\VEN_XXXX&DEV_YYYY&SUBSYS_ZZZZZZZZ&REV_WW 的字符串。
- VEN_XXXX 中的 XXXX 就是 VID (Vendor ID)。
- DEV_YYYY 中的 YYYY 就是 DID (Device ID)。
- SUBSYS_ZZZZZZZZ 中的 ZZZZZZZZ 通常包含 Subsystem Device ID 和 Subsystem Vendor ID。前四位是 Subsystem Device ID,后四位是 Subsystem Vendor ID。例如,如果显示 SUBSYS_813910EC,则 8139 是 Subsystem Device ID,10EC 是 Subsystem Vendor ID。
- 对于某些设备,特别是USB设备,您可能会看到 USB\VID_XXXX&PID_YYYY 的格式,其中 PID 即为 Device ID。

三,抛砖引玉
在这一章中我们介绍了PCIe设备Vender ID, Device ID, Subsystem Vendor ID, Subsystem ID的区别。那么PCIe配置空间的header里(前0x3F)其它寄存器的具体读出的值是什么呢?
敬请关注下一篇:《PCIe从入门到精通之十四:PCIe设备的配置空间header详解实战》
四,参考文献:
需要以下参考文献(PCIe标准)的朋友,请关注本微信公众号“硬件工程师宝典”,在对话框内回复“PCIe”,将获取标准下载链接。

百度网盘分享的文件
更多推荐

所有评论(0)