好大一棵树 – PCIe Tree
树?
树这个概念我们应该是很熟悉的了,生活周围到处都是。树的主要四部分是根、干、枝、叶。而树根一般在地下。我们常看见的也就是以上的树干、树枝、树叶。
PCIe树?
学习PCI/PCIe,最常听到的一个名词也是“树”,PCIe tree。所谓的PCIe tree就是PCIe specification定义的了PCIe系统的拓扑结构。定义了这个拓扑,我们所有的设备内部的PCIe设备都可以抽象对应到一颗“树”上来。
注意:spec里面这个拓扑图的RC和CPU是两个独立的部分,事实上,我们常用的处理器目前大部分都是把CPU和RC集成到了一起。
这是一颗倒着生长的树!树的根即是RC(Root Complex),我们叫做根节点或者根联合体。RC内部的结构和处理机制如同我们看不到的树在地面以下的错综复杂的根。管他呢,这部分我们并不十分care。记住,这里是根,是一切的开始就好。
从根节点开始向下生长出树干和树枝(PCIe链路),某些树枝还扩展生长出旁路的分支,这些可以扩展生长的地方,对应拓扑中的Switch。最末端的叶/果实,对应拓扑中的EP(End Point)。
怎么看PCIe树?
Linux提供了一个lspci的命令,用于显示当前主机的所有PCI总线信息,以及所有已连接的PCI设备信息。加上-t参数(t:tree)即给我们显示了系统中的PCIe tree拓扑,只不过这颗显示的树是横向的,转了90度。
Lspci其实是一个开源工具pciutils(http://mj.ucw.cz/sw/pciutils/)的命令,对应命令还有setpci(用于读写PCIe配置寄存器)。如果你的系统中找不到这个命令,可以执行yum install pciutils安装即可。工具官网或者内核官网可以下载到源码,阅读分析这些源码对于开发PCIe相关内容有极大的帮助。
而Windows下,有一个很久没有更新的工具,叫pcitree (http://www.pcitree.de/)。有兴趣的可以下载来玩玩。注意:只能运行于win7以及之前的windows版本,在我的win10上无法运行。
树乱了?
做底层驱动开发特别是PCIe驱动相关的开发,经常看到的一个错误就是“树乱了”。树乱了从表面上看,即是lspci -t的内容发生了错乱,跟正常情况下的树不一样了。本质上,“树乱了”由于系统中的某些PCIe设备出错或者异常导致的。lspci -t时,系统会重新访问这颗树上的所有设备,由于部分PCIe设备的异常,访问失败(返回异常值或者全F),从而影响pciutils构建出一颗完整的树,出现部分树枝断裂(链路link down),树叶错位(EP Bar空间异常)等现象。
思考:
一个系统中只能有一颗树么?
有一只蚂蚁决定从根爬到一片叶上去(从RC到EP),怎么导航?
不同的树之间能否通讯?
这个树到底是个什么树???