PCI 总线结构学习
一、PCI总线概述
1.1 PCI总线定义
PCI(Peripheral Component Interconnect)是一种由英特尔(Intel)公司1991年推出的用于定义局部总线的标准。PCI局部总线标准的制定主要目的是为了实现一种将周边设备与处理器高速结合起来的总线结构,以便适应用户对于数据率越来越高的要求。使用PCI总线最突出的特点就是CPU占用率低,因为它和存储器之间的交互基本上通过DMA方式。
1.2 基于PCI总线的处理器系统
PCI总线作为处理器系统的局部总线,主要目的是为了连接外部设备,而不是作为处理器的系统总线连接Cache和主存储器。PCI总线是通过PCI桥路(包括PCI控制器和PCI加速器)与CPU总线相连。下图为基于PCI总线的处理器系统示意图。
在PCI总线中,HOST主桥可以直接推出一条PCI总线,这条总线也是该HOST主桥的所管理的第一条PCI总线,该总线还可以通过PCI桥扩展出一系列PCI总线,并以HOST主桥为根节点,形成1颗PCI总线树。就像上图HOST主桥x及其所连接的PCI桥x1所示。
二、PCI拓扑结构
PCI总线的组成:HOST桥、PCI桥、PCI设备。PCI采用的是树型拓扑结构,每一个PCI设备相当于树的一个结点或者叶子,对整个PCI总线的遍历可以采用遍历树的算法,在对树进行遍历之后,可以获得整个PCI总线的资源需求情况,从而进行统一的分配。PCI总线上有多个设备,当他们需要通信时,都必须向PCI总线仲裁器提出申请,当得到允许后才能在总线中发送数据。
2.1 HOST桥
HOST主桥是用来隔离处理器的存储器域与PCI总线域的特殊桥片,管理PCI总线域。在其所管理的PCI设备中所有设备的配置空间都由HOST主桥通过配置读写总线周期访问的。
PCI总线上的设备都有自己的设备地址,处理器空间地址和PCI总线地址通过HOST主桥进行隔离。HOST主桥中有很多的寄存器,可以使得处理器工作的频率和总线工作的频率不一样,通过寄存器缓存数据,当处理器需要访问PCI设备时,需要通过HOST主桥进行地址转换,把处理器地址转换成PCI总线地址,然后才能访问PCI设备;同理,PCI设备中的数据要想往外走,也要通过HOST主桥进行地址转换。说到底,HOST主桥就是一个桥梁。
同一HOST桥中的设备可以通讯,HOST主桥可以通过设置Inbound寄存器来让不同的PCI总线域中的设备进行通讯。在一个处理器系统中,有几个HOST主桥,就有几个PCI总线域。
2.2 PCI桥
PCI桥是PCI总线的一个重要组成部件,该部件的存在使得PCI总线极具拓展性。PCI的可扩展性指的是PCI总线上可以挂个PCI桥,然后PCI桥会推出另一条PCI总线,PCI总线上又可以挂载PCI桥,再推出PCI总线…但是,PCI总线以HOST主桥为树根,连接的设备上限为256,其中包括HOST桥和PCI桥。
PCI桥的作用可以隔离PCI设备,不影响各条总线的带宽。如果PCI桥出现问题,那么PCI桥下的设备之间可以自由通讯但是无法将数据发送到外面。
2.3 PCI设备
PCI Agent设备:一个PCI设备既可以是主设备也可以是从设备,但是在同一个时刻,这个PCI设备或者为主设备或者为从设备。PCI总线规范将PCI主从设备统称为PCI Agent设备。
PCI设备的地址可以由系统软件动态分配,解决了地址冲突。每个PCI设备有一个独立的配置空间,里面有设备在总线上的地址,PCI桥的配置空间中有其PCI子树使用的地址范围。PCI设备与存储器直接进行数据交换的过程也被称为DMA。PCI总线进行DMA操作时,需要得到数据的大小和目的地址,PCI总线域的物理地址,HOST主桥会负责地址转换。
2.3.1 Linux系统下的 PCI设备目录
- 查看Linux系统下有多少条PCI总线,命令:
ls /sys/class/pci_bus/
- 查看 linux 系统下有多少个 PCI设备,命令:
ls /sys/bus/pci/devices/
- 查看目录下找到安装的 PCI设备驱动模块,命令:
ls /sys/bus/pci/drivers
三、Linux系统下的 PCI树形结构
3.1 获取树形结构
获得当前 linux 系统下的 PCI设备树,命令:
lspci -tv
3.2 解读树形结构
由图2可知,此时一共有35条总线,开头0000:00就是第一条总线。
00.0、07.1、07.3、0f.0、10.0都是普通的pci终端设备。而07.0即使ISA桥,
而01.0后面接了[],还有结构,所以说明他是桥设备。
验证一下。
通过命令lspci -s [bdf] -v分别查询0000:00:00.0,0000:00:01.0,0000:00:07.0,0000:00:0f.0,0000:00:10.0对应的设备信息,发现分别是主桥、PCI桥、ISA桥,其他的都是普通设备。
进一步验证11.0,15.07,16.07,17.0~7是pci桥设备,其中,11.0下面挂接02号总线,02总线下面还有几个pci设备:00.0,01.1,02.0,03.0, 05.0
over!