谈谈PCIe VID、DID、SSID、SSVID背后的智慧

PCIe Vendor ID

想了半天还是觉得从“ID是什么”这个问题开始比较好。那么ID是什么?ID就是身份。那身份又是什么?身份就是一个合理存在,用于区分不同个体。为什么叫“合理存在”呢?如果国家不给你发身份证,你就是黑户,很多事你都干不了。这意味着什么呢?你合理存在大家才敢认识你,了解你,跟你一起玩,一起做很多很多美好的事。这就是身份的现实意义,PCIe的Vendor ID其实也是这个思想。

你想做PCIe产品?必须得从PCI-SIG申请一个身份,也就是Vendor ID(即VID),用它来标记你的公司。有了这个东西,PCI-SIG的大家庭才带你一起做很多很多事,这里可以列举几个事情的例子供大家一起理解。

  1. 比如你是个网卡或者显卡芯片的开发者,有了Vendor ID你的卡才能合理的接入主机。

  2. 比如你要买别家的PCIe IP用来做SOC芯片,有了Vendor ID人家才会跟你谈买卖,谈技术支持。

  3. 比如你发现协议哪里定义的有问题,有了Vendor ID才可以提出你的修改意见。

  4. 比如你要从PCI-SIG买测试夹具,有了Vendor ID人家才卖给你。

还有很多很多事情,没有“身份”是做不了的。那没有身份行不行呢?这个问题就属于社会学问题了,需要大家自己去悟。

我们回头继续思考第一个问题。为什么说有了Vendor ID你的网卡或者显卡才能合理的接入主机呢?这是因为在工程上你做完设备之后还要为你的设备做驱动,你的驱动要合入操作系统才能工作,而操作系统就是根据Vendor ID来选择加载谁家的驱动。想想看为什么你的电脑插上NVIDIA的卡或者AMD的卡都能正常工作,为什么换一张不同厂家的网卡,机器也照常运转。这背后的逻辑就是用一个简单的Vendor ID来实现的。注意这么讲是有一些不准确的,这么讲的目的是为了强调Vendor ID的重要性,我们之后会逐步完善其中道理。

当然事情并没有那么简单,Vendor ID只是开了个头,驱动开发还是有蛮多事情要做的。

协议中的定义

在开始剩下的话题之前我把协议中定义这些ID的地方贴出来,这样我们理解起来就有一个直观的感受。

下图是Type 0 Configuration Space Header中的定义。

图片

下图是Type 1 Configuration Space Header中的定义。

图片

我们都知道Type 0类型设备是EP,而Type 1类型设备是RC或者Switch。Type 1设备没有Subsystem Vendor ID和Subsystem ID吗?其实不是,PCI-SIG专门定义了一个Subsystem ID and Sybsystem Vendor ID Capability 来为Type 1设备定义Subsystem Vendor ID和Subsystem ID,如下图。

图片

这就是PCIe强大扩展能力的一个表现,如果你想扩展一个功能,就增加一个Capability。想想看,如果16-bit的Vendor ID和Device ID不够用了,PCI-SIG会怎么办?

从另一个侧面,为什么PCI-SIG从一开始就不为Type 1设备在Type 1 Configuration Space Header中定义好Subsystem Vendor ID和Subsystem ID呢?增加一个DW不行吗?当时的背景我不知道哈,反正从现在来看,我觉得用一个Capability来扩展的方式增加了协议的理解难度,不太好。

PCIe DID、SSID、SSVID

理解了Vendor ID的核心思想,再来理解DID、SID、SVID就舒服多了,他们都是“身份”,只不过应用场景变了。

DID即Device ID。虽然PCI-SIG定义了Device ID的字段,但这个字段的值确实由Vendor自行定义的,它的目的是用来定义Vendor实现的不同类别的产品。NVIDIA每年都会发布一些产品,每发布一个新的产品,它的驱动都要随着变化。用Device ID来赋予每个产品不同的身份,就可以为不同的产品加载对应的驱动。

SSVID即Subsystem Vendor ID,协议上简写为SSVID,实际上还有叫SVID的简称,虽然我们以协议为准,但是这个事情还是要知道的。PCI-SIG定义这个字段的目的是为了把板卡制造商管理起来。如果做芯片的和做板卡的不是同一家公司,那么定义这个值就有意义了,因为你同一型号的芯片可以卖给多个板卡厂商去做,而不同的板卡厂商因为设计上的差异性会引入驱动上的差异性。而用SSVID就可以解决这个问题。

SSID即Subsystem ID,同样也还有SID的叫法。借助对DID的理解,大家可能已经能知道这个字段的意义了,有些PCB厂家可能会用同一个芯片做不同的板卡,所以用这个字段来解决这个问题。

顺便再聊一下配置空间中的Revision ID(RID)。玩家们都知道,厂家在发布驱动的时候并不是一次就能发布最好的驱动,厂家可能会因为修改BUG、优化性能等原因而修改驱动,厂家管这个过程叫驱动升级。驱动每升级一次,就要相应的改变一次Revision ID。当然驱动回退也是用这个字段实现的。

最后附一下Linux和Windows操作系统中查看这些ID的方法。大家直观感受一下。

Windows:

设备管理器中右击PCI相关硬件 → 属性 → 详细信息 → 硬件ID:

图片

Linux:

使用lspci命令

图片

做个总结

还记得我们前面聊Vendor ID时说过的描述不准确的问题吗?PCI-SIG其实是通过VID、DID、SSVID、SSID和RID把整个PCIe设备开发过程中可能发生变化的地方都涵盖进去,从而让操作系统总是能加载到正确的驱动的,单一个Vendor ID是不够的。

不得不说PCI-SIG定义的ID思想真的是大智慧。这种思想其实现在已经渗透到了很多技术开发领域,在我们的芯片开发过程中,我们会定义CHIP ID来标识芯片的唯一性,我们也会定义Foundary ID来标识芯片是由谁生产的,定义TestVendor ID来标识芯片是由谁测试的。甚至在SOC芯片的设计过程中,我们也会使用ID的概念来标识各个组件,这使得我们在各组件的访问关系上可以做很多的事情,比如访问保护等等。

好了,这次就写到这里,如果有不同见解,还是请不吝赐教。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/421599.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[笔记]电参数测量的现有方案

1.关键字: 电参数测量 Electrical Parameter Measurement 2.相关信息搜集 》》电参数测量仪是如何测量电压电流相位差的?对于变频器那种比较毛的波形,也能测量? 电参数测量仪测量电压电流相位差的方法主要依赖于其内部的高精度…

信号保存和处理

把上一篇回顾一下吧:共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,进程不再通过执行进入内核的系统调用来传递彼此的数据 共享内存的数据结构: struct shmid_ds {…

Pycharm使用debug运行时,一直显示collecting data...,但是变量一直显示不出来,显示超时

一、问题: 二、解决办法 1.File—>Setting 2.Build---->Python Debugger 3.勾选Gevent compatible ,然后Apply 三、解释Gevent compatible 1.在 PyCharm 中,Gevent compatible 通常与 gevent 库的兼容性设置有关。gevent 是一个基于协…

NC字典树的实现

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 字典树又称为…

Ubuntu系统修改静态IP

1.先查看一下我们的ip rootcaiji:~# ip a 2.查看此时的网卡配置文件 rootcaiji:~# cat /etc/netplan/00-installer-config.yaml # This is the network config written by subiquity network: ethernets: ens33: dhcp4: true version: 2 此时可以看出来dhcp…

SpringCloud Alibaba入门简介

1、诞生 2018.10.31,Spring Cloud Alibaba 正式入驻了 Spring Cloud 官方孵化器,并在 Maven 中央库发布了第一个版本。 2、是什么,去哪下 官网:Spring Cloud Alibaba官网_基于Springboot的微服务教程-阿里云-阿里云Spring Cloud …

【论文阅读笔记】Tackling the Generative Learning Trilemma with Denoising Diffusion GANs

【论文阅读笔记】Tackling the Generative Learning Trilemma with Denoising Diffusion GANs Introduction方法 使用传统GANS建模去噪分布理解模式覆盖率 Paper:https://arxiv.org/abs/2112.07804 Code:https://github.com/NVlabs/denoising-diffusion-…

Docker启动Mysql镜像报错问题?

docker中启动mysql镜像报错如下:ls: cannot access /docker-entrypoint-initdb.d/: Operation not permitted 百度上查到了很多解决方案,也咨询了很多大佬,加权限,改用户,均无果。最终在阿里巴巴上找到了解决方案&…

[论文笔记]ChatQA: Surpassing GPT-4 on Conversational QA and RAG

引言 今天来看一下上篇论文笔记中反复介绍的 ChatQA: Surpassing GPT-4 on Conversational QA and RAG。 为了简单,下文中以翻译的口吻记录,比如替换"作者"为"我们"。 我们介绍了 ChatQA,这是一个模型套件,一…

算法设计(一)

1.汉诺塔 介绍 汉诺塔(Hanoi Tower):它描述了如何将一堆大小不同、穿在一根柱子上的盘子移动到另一根柱子上,同时满足以下规则: 每次只能移动一个盘子。 每个移动盘子时,大的盘子不能放在小的盘子上面。 可以使用一根…

curl和ping

curl获取页面内容,ping测试连通 curl和ping是两个在网络环境中常用的命令行工具,但它们的目的和应用场景有很大的不同。 curl 用途:curl是一个命令行工具,用于传输数据,支持多种协议,包括HTTP、HTTPS、FT…

1. 运动控制指令概要(omron 机器自动化控制器)

机器自动化控制器——第一章 运动控制指令概要 1-1 运动控制指令PLCopen运动控制用功能块运动控制指令概要▶ 运动控制指令的种类▶ 状态变化▶ 运动控制指令的启动和状态▶ 异常处理▶ 执行运动控制指令时输入变量的变更(指令重启)▶ 通过选择缓存模式执行指令多重启动▶ 通过…

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以…

C语言程序设计——函数(一)

一、概述 一个较大的程序可分为若干个程序模块,每一个模块用来实现一个特定的功能。在高级语言中用子程序实现模块的功能。子程序由函数来完成。一个C程序可由一个主函数和若干个其他函数构成。 由主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多个函…

C语言-数据结构 无向图克鲁斯卡尔算法(Kruskal)邻接矩阵存储

相比普里姆算法来说,克鲁斯卡尔的想法是从边出发,不管是理解上还是实现上都更简单,实现思路:我们先把找到所有边存到一个边集数组里面,并进行升序排序,然后依次从里面取出每一条边,如果不存在回…

99.游戏安全项目-可见数据的搜索与技巧

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:易道云信息技术研究院 上一个内容:98.游戏的启动与多开-分析与实现多开器 下图中红框位置显示的数据,只有下图…

横版闯关手游【全明星时空阿拉德】Linux手工服务端+运营后台+双app端

横版闯关手游【时空阿拉德】(【全明星阿拉德】)阿拉德系列2022整理Linux手工服务端余额充值后台安卓苹果双端。 运营后台看目录结构是thinkphp开发的。 代码免费下载:百度网盘

再识Clip

来源 CLIP损失函数的理解-CSDN博客 Simple Implementation of OpenAI CLIP model: A Tutorial | Towards Data Science 【小白】一文读懂CLIP图文多模态模型_clip模型-CSDN博客 从 CLIP 聊聊多模态自监督学习新范式 - 知乎 (zhihu.com) CLIP 论文逐段精读【论文精读】_哔哩…

BC173 牛牛逆序输出(c 语言)

1.// 描述 //牛牛在尝试把一个整数逆序地输出。 //输入描述: //输入一个正整数 n。保证个位数不是 0 //输出描述: //逆序输出这个正整数。 //2345 //5432 2.我们先输入n,然后我们进行取余,然后将余数存储起来在arr中,然后除10。…

串口接收不到数据之电阻虚焊bug分析思路

单片机和EC移远通信模块进行通信,相同的代码运行在相同的硬件上,但是一个能联网,一个因为没有EC的应答连不上网。 开始分析,排除软件问题,给EC模块发为什么没应答? 1.发送失败 2.接收失败 排除情况2&#x…