【PCIE3】---PCIE设备的枚举扫描(经典好文)

前面两个小节大致总结了下PCIE的基本知识,算是扫盲篇吧。本文主要总结PCIE设备的枚举扫描过程,此部分才是PCIE模块的重点,无论是在BIOS下还是系统驱动下都会用到。

按照国际惯例,先列问题:

  1. 系统如何判断PCIE设备是否在位?

  2. 设备中的配置空间的数据一开始就有嘛?谁写的?

  3. Bus号,Dev号,和Fun号与硬件有关系嘛?硬件链接与BDS号的分配是否有关?

  4. Bridge和Device的区别?

  5. Device和Function的区别?

  6. 枚举的流程是怎么样的?

系统如何判断PCIE设备是否在位

  BIOS代码在枚举设备的时候,会去读每个设备的DID&VID,如果读到的是不是FFFF,则表示此位置有设备存在,若为FFFF,则表示设备不存在。DID&VID是出厂时就固定在PCIE设备配置空间中的数据,表示每个不同的设备,同理,我们在BIOS中也可通过判断这个ID值来寻找指定的PCIE设备。

设备中的配置空间的数据一开始就有嘛?谁写的?

  每个设备在出厂时,其配置空间中的值都有一些default值,枚举该设备是,为每个设备分配BDS号和内存资源时,会再写入部分值。

Bus号,Dev号,和Fun号与硬件有关系嘛?硬件链接与BDS号的分配是否有关?

  这个问题很关键,我想应该大部分的同学都会弄得不是很清楚,笔者一直以为BDS号是在枚举过程中全部由软件分配的,但实际应该不是这样的。与多个同事讨论后,基本断定:Dev和Fun号应该是和硬件设计有关系,也就是硬件就已经固定,软件的枚举过程是更多的是在分配Bus号。

这个说法不知道会不会颠覆部分人的认识,基本这个结论是请教讨论得来,后续我在验证(标记--待验证)

Bridge和Device的区别?

  PCIE设备树的实现,离不开Bridge,我个人更倾向于简单一点去看带着Bridge和Device,或许可以这样说:Bridge是一条Bus的管理者,当你看到一个Bridge的时候,也会对应的有一条Bus。那Device就简单的多了,简单的一个终端设备。不过目前在我看来Bridge某种意义上也可以算的上一种Device

因为在枚举扫描的时候,接下来扫到的这个是什么?你假设它为Bus1,Dev0,Fun0,然后发现有设备,去读了配置空间的Header和ClassCode后才知道这是一个Bridge还是device,但实际上你已经假设它为一个Device了,不是嘛?哈哈

  这里对桥和设备的判断是通过HeaderType和ClassCode来判断的,如下:

  待添加:

Device和Function的区别?

  这个问题困扰了笔者很久的时间,其实真正弄懂了以后发现,可以不用钻的太深,最大的疑惑是: Dev到底对应的是不是一个设备,Fun是不是这个设备的具体的一个功能?请教了好多人,每个人给的回复都不一样。其实笔者后来总结部分情况下是这样的,对于你插入的某个设备,其Function号对应的就是它不同的功能。

枚举的流程是怎么样的?

  又是一长串的知识扫盲,以上问题都是困扰了笔者许久的问题,因此单独列出来,作下说明,希望能解答和我有同样疑惑的你们。接下来就要进入正式的枚举过程了,如下图是枚举之后的两个图,希望各位同学对着这两个图,来看这个过程,你就会知道枚举到底是怎么回事了?

                                             

 1. 对CPU来说,最开始仅仅知道Bus0的存在,Bus0下面都有什么设备,PCIE树是怎么样的一概不知。因此首先从Bus0,Dev0(桥A)开始,先去读Dev0中Fun0的DID&VID(一定是从Fun0开始),看其是否返回0,如果不为0则表示设备存在,继续下一步。若返回FFFF,则Dev0中没有Fun0(任何设备的第一种功能一定是0),因此该设备不存在,继续探查Bus0,Dev1,Fun0

 2. Bus0,Dev0,Fun0存在,读其Header寄存器的值为“1”,则表示这是一个PCI To PCI Bridge(桥B),每一个bridge对应一个Bus,那么接下来就开始填写这个Dev0,Fun0的配置空间,将其总线号寄存器设置如下:

  Primary Bus Number = 0;                    以下简称为PBN

  Secondary Bus Nymber = 1;               以下简称为SBN

  Subordinate  Bus Number = 1;            以下简称为SuBN

  至此,桥B知道了他管理的下游的一条Bus,编号为1,下游最远(也就是Bus号最大的那个Bus是1)

 3. 更新HostBridge的SuBN = 1

 4. PCIE设备扫描遵循深度优先法则,因此在进行Bus0其他Dev扫描之前,必须首先扫面Bus1

 5. 软件读取Bus1,Dev0,Fun0的DID&VID,若返回不为FFFF,则该设备存在。在此查看Header寄存器值为1,表名Bus1,Dev0,Fun0依旧是一个PCI to PCI Bridge,。且Bit7是0.说明桥C是单功能设备

 6. 至此开始设置桥C的总线号寄存器

  Primary Bus Number = 1;

  Secondary Bus Nymber = 2;

  Subordinate  Bus Number = 2;

  然后再更新桥A,桥B的 SuBN = 2

 7. 继续延续深度优先法则,开始扫描桥C下管理的Bus2总线,首先读取Dev0,Fun0的DID&VID,会发现结果与之前一直,Bus2,Dev0,Fun0设备存在,其Header寄存器值为1,表明又是一个PCI to PCI Bridge(桥D),bit7为0,说明桥D也是单功能设备。

 8. 设置桥D的总线号寄存器

  Primary Bus Number = 2;

  Secondary Bus Nymber = 3;

  Subordinate  Bus Number = 3;

  然后再更新桥A,桥B,桥C的 SuBN = 3

 9. 继续深度优先法则,扫描桥D下的Dev0,Fun0, 发现DID&VID存在,则表示Bus3,Dev0,Fun0存在,查看其Header寄存器的值为0,表名是一台端点设备,不是在是Bridge,且Bit7是一台多功能,这就对应到某个具体设备的多个功能了,Bridge的话就仅有一个功能--桥接。

 10. 然后接着扫描Bus3, Dev0, Fun1-7,会发现仅有Fun1存在。

 至此基于深度扫描法则的一条支路扫描完毕,其实到这个地方大家应该就能发现,深度扫描的意思大概是什么了,简而言之就是只要有Bridge就往下一直走,走到最后不是Bridge的那个点,PCIE设备树的结构也是在这样的基础上完成的。

 11. Bus3扫面完毕后,枚举软件返回到上层Bus,也就是Bus2上的其他设备。之前已经扫描国Bus2 Dev0,Fun0,并且属于这个分支的都已经扫描完毕,接下来要扫描Bus2,Dev1,Fun0. 同样DID&VID存在,且Heade寄存器表明该设备是一个Bridge设备(桥E)。

 12. 设置桥E的总线号寄存器

  Primary Bus Number = 2;

  Secondary Bus Nymber = 4;

  Subordinate  Bus Number = 4;

  然后再更新桥A,桥B SuBN = 4

  这个地方要注意了,桥E是挂载Bus2下载设备,因此PBN = 2没有问题,但是这个SBN = 4,SuBN = 4相比大家应该也不会有任何问题吧,截止到桥E(一个桥代表有一个Bus,编号分到Bus4),该分支下最远的Bus应该就是到Bus4,所以这样设置,但是再更新上游桥的SuBN就已经没有桥C的了,这是为什么呢?  ---  因为桥C和E是不同的支路。而每次更新SuBN,我们仅仅更新同一条支路上的所有Bridge上的SuBN的值。

 13. Bus4(桥E)也分配好了,接下来扫描Bus4下的设备,首先就是Dev0,Fun0,其Header寄存器值为0表示是一台端点设备,bit7为0表示一台单功能设备,OK,已经到头,且此Dev0没有更多Fun,此条支路到此结束。

其他的支路扫描与上述过程类似,在此不再赘述。截至此,基本描述完PCIE设备的枚举过程,过程还是比较简单的,就是要结合很多硬件设计的知识,以及其这样设计的初衷和原理,对此的了解会更加深刻一些!

  

  

  

原文地址:https://www.cnblogs.com/szhb-5251/p/11620310.html

时间: 2024-08-02 22:13:42

【PCIE3】---PCIE设备的枚举扫描(经典好文)的相关文章

漏洞挖掘方法之静态扫描+经典栈溢出实例

标 题: 漏洞挖掘方法之静态扫描+经典栈溢出实例 时 间: 2014-02-11,01:52:50 这是笔者公开发表的关于漏洞挖掘的第二篇文章,与发第一篇的时间差不多间隔了整整一年,在这一年里虽然工作细碎,但我还是抽出了大量的时间关注安全,因为当初的既定目标就是走安全的路.这一年了也做了不少关于安全方面的事情,比如参加各大*SRC的漏洞提交什么的,曾今有一段时间也是走火入魔了一样,但是后来我停下来了,因为我觉得那种事情偏离我最初对"漏洞"挖掘的定义,看了那些提交的所谓"漏洞&

USB协议-USB设备的枚举过程

USB主机在检测到USB设备插入后,就要对设备进行枚举了.为什么要枚举?枚举就是从设备读取各种描述符信息,这样主机就可以根据这些信息来加载合适的驱动程序,从而知道设备是什么样的设备,如何进行通信等. 枚举的过程: 1.  USB主机检测到USB设备插入之后,就会先对设备复位.USB设备在总线复位后其地址为0,这样主机就可以通过地址0和那些刚刚插入的设备通信.USB主机往地址为0的设备的端点0发送获取设备描述符的标准请求(这是一个控制传输的建立过程).设备收到该请求后,会按照主机请求的参数,在数据

借助WinDriver认识Windows PCIE设备的空间结构

本文主要通过WinDriver工具图形化的查看PCIe设备,来认识PCIe设备的空间结构.本文主要参考<PCI Express体系结构导读>和网友博客:点击打开链接. 一.PCIe设备空间结构 PCIe设备有三个独立的物理地址空间:设备存储器空间(memory).IO空间和配置空间(config).由于PCIe设备支持即插即用,存储器空间和IO空间是在设备插入host后由操作系统决定其映射的基地址.参考微软PLX9x5x的代码: // // Parse the resource list an

扫描的pdf文档怎么合并

事情是这样的原本手头上有30份PDF文档,用户希望能够在一个PDF文档中浏览出所有的文章,貌似能支持批量PDF文档合并的软件并不多,为了解决这一难题,我翻阅了很多教程讲解,发现有一款阅读和下载量挺多,于是狠下心下载出来亲自测试发现却是不错. 究竟这款pdf合并软件有什么功能呢?下面一起来看看究竟是怎样合并的: 要解决扫描版PDF文档合并,其实方法很简单,如果你的电脑里面安装了迅捷PDF合并软件,那么在你电脑上开始运行软件,单击进入程序界面,即可进行合并文档的操作. 1).打开PDF合并器后,找到

扫描的PDF文档快速导入书签栏

扫描的PDF文档快速导入书签栏 1.  将带标题的Word生成PDF文档,Word导出的PDF文档是带有标签,操作如下: 2.  下载绿色软件FreePic2Pdf,打开选择更改PDF: 3.   首先从PDF中摘取书签,选择Word导出PDF文件,选择新的文件地址生成书签数据: 4.  生成的书签数据如下: 5.  往扫描版PDF挂书签,点击开始: 书签生成,灰常好用. 原文地址:https://www.cnblogs.com/CSZhang/p/12568483.html

苹果获专利 iOS设备摄像头自动对焦扫描

2014-07-28 10:44来源:cnbeta网站 美国专利商标局今天公布了苹果获得的一项专利——图像捕捉设备的持续自动对焦机制,其中涉及iPhone.iPad和iPodtouch的摄像头.苹果在专利文件中表示,持续自动对焦机制能够让图像捕捉设备的镜头进行自动对焦扫描,获得与自动扫描相关的聚焦分数.持续自动聚焦扫描机制能够决定一个可接受的聚焦分数段范围. 为一个图像捕获设备(镜头)执行自动对焦扫描                        502 将获取焦点分数与自动对焦扫描相关联   

【转】经典网文:追MM与设计模式

设计模式做为程序员的“内功心法”,越来越受到.net 社区的重视,这种变化是很可喜的,Java社区走在了我们的前面,但这种状况也许有一天会发生改变. 从追MM谈Java的23种设计模式1.FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了.麦当劳和肯德基就是生产鸡翅的Factory.  工厂模式:客户类和工厂类分开.消费者任何时候需要某种产品,只需向工厂请求即可.消费

[经典] 回文问题(三)

Longest Palindromic Substring 最长回文子串 Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 普通做法,动态规划O(N^2)是能直接出结果的,长度从小到大排列,可以边动规

异步5月新书,大咖云集本本经典(文末福利)

点击关注异步图书,置顶公众号 每天与你分享IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书. --异步小编 5月小长假回来,小编带来了18本异步新书,这些新书涵盖热点领域Python.深度学习.CPU设计.微服务.少儿编程等领域.可以说本本重点. 有一种语言叫Python <"笨办法学"Python3>基于Python3.6,支持手机扫码看视频.入门级 <Python编程从入门到精通>基于Python3,33小时视频讲解.900多案例分析.入门级