PCIE研究-1

PCI-Express(peripheral component interconnect express)是一种高速串行计算机扩展总线标准,

PCIe属于高速串行点对点双通道高带宽传输,所连接的设备分配独享通道带宽,不共享总线带宽,主要支持主动电源管理,错误报告,端对端的可靠性传输,热插拔以及服务质量(QOS)等功能。

PCI Express X1规格支持双向数据传输,每向数据传输带宽250MB/s,PCI Express X1已经可以满足主流声效芯片、网卡芯片和存储设备对数据传输带宽的需求,但是远远无法满足图形芯片对数据传输带宽的需求。

通常将PCI-e总线协议分为3层处理:

一 、PCI-e协议层

通常将机械层和物理层合并为物理层(PHY Layer)(PLP),紧接着第二层为数据链路层(DLL)(DLLP),第三层为事务传输层(TL)(TLP),应用层不算在内。

物理层中的机械层:

机械层定义了诸如对连接器、卡外形尺寸、卡检测和热插拔等要求的机械环境。

物理层中的电气和逻辑层:

    • 物理层下的电气层实现包括收发器、模拟缓冲器、串行/解串行器(SerDes)在内的模拟器件以及10位接口。

    • 物理编码子层(PCS)把每8位数据字节编码/解码为10位代码。这种编码特性不仅能检查有效字符,而且也限制了被发送的“0”和“1”数量上的差异,从而同时在发射器和接收器侧保持了DC均衡,进而大大提高了电磁兼容性(EMC)和电气信号性能。

插入一个概念:

数据包:数据在PCIe网络上的传输过程,PCIe实际上是以数据包的形式在各系统间或数字接口的各层之间传输的。首先是应用层发起事务传输,事务传输层把把请求转换为一个PCIe数据包。数据链路层为该包添加序列号和链路CRC(LCRC)。数据链路层确保数据接收的正确性,然后在物理层PCIe链路上传输该事务。

数据链路层:实际上该层的主要作用是保证数据传输的可靠性,对接受或者发送的数据包进行各种校验处理。

数据链路层完成的主要任务是:

    1. 数据交换。接收发送方处理层的TLP包,并送到物理层。另外从物理层接收TLP包并送到接收端的处理层。

    2. 出错检测和裁决。LCRC和序列号(TLP Sequence Number)的生成;存储发送端的TLP用于再试重发;为TLP和DLLP做数据完成性检测(crc校验);DLLP的ack和nack响应;错误指示;链接确认超时重试机制。

    3. 初始化和电源管理。跟踪链路状态并传送链路活动、链路复位、链路失去连连等状态给处理层;

    4. 生成DLLP。用于链路管理功能包括TLP确认、电源管理、流程控制信息(VC通道初始化)交流。在链接两端的数据链路层点对点传输、

二、PCI 总线域

PCIE研究-1_第1张图片

PCI 总线域由 PCI 设备所能直接访问的地址空间组成。在一个处理器系统中,可能存在多个 HOST 主桥,因此也存在多个 PCI 总线域。在上图所示的处理器系统中,具有两个 HOST 主桥,因而在这个处理器系统中存在 PCI 总线 x 和 y 域。

在多数处理器系统中,分属于两个 PCI 总线域的 PCI 设备并不能直接进行数据交换,而需要通过 FSB 进行数据交换。值得注意的是,如果某些处理器的 HOST 主桥支持 Peer-to-Peer 数据传送,那么这个 HOST 主桥可以支持不同 PCI 总线域间的数据传送。

lspci 用于查看 linux 系统下面的pci设备。详细帮助可以通过命令 man lspci 获取详情。

[root@localhost ~]# lspci
00:00.0 Host bridge: Intel Corporation 4th Gen Core Processor DRAM Controller (rev 06)
00:01.0 PCI bridge: Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor PCI Express x16 Controller (rev 06)
00:02.0 VGA compatible controller: Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller (rev 06)
00:03.0 Audio device: Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor HD Audio Controller (rev 06)
00:14.0 USB controller: Intel Corporation 8 Series/C220 Series Chipset Family USB xHCI (rev 05)
00:16.0 Communication controller: Intel Corporation 8 Series/C220 Series Chipset Family MEI Controller #1 (rev 04)
00:19.0 Ethernet controller: Intel Corporation Ethernet Connection I217-LM (rev 05)
....

通过 lspci 命令,我们可以得知当前系统上所有的 pci 设备信息。当需要选择特定一个 pci 设备的时候,可以通过 lspci -s bdf 来指定,这个 bdf 就是 lspci 输出的前三列的内容。bdf 的全称其实就是 bus : device . func。

[root@nsa ~]# man lspci
....
 Options for selection of devices
       -s [[[[]:]]:][][.[]]
....


三、linux 系统下的 pci 设备目录

pci 的拓扑结构为:pci 桥(包括 HOST 主桥)下面可以延伸出一条 pci 总线,pci 总线上面挂着 pci 设备和 pci 桥。

我们可以通过 /sys/class/pci_bus/ 目录查看 linux 系统下有多少条 pci 总线,查看pci bus总线情况。

[root@localhost ~]# ls /sys/class/pci_bus/
0000:00  0000:01  0000:02  0000:03  0000:04  0000:05  0000:06  0000:07  0000:08  0000:09

我们也可以通过 /sys/bus/pci/devices/ 目录查看 linux 系统下有多少个 pci 设备(以及相应的设备号 bdf),查看pcie设备号。

[root@localhost ~]# ls /sys/bus/pci/devices/
0000:00:00.0  0000:00:03.0  0000:00:19.0  0000:00:1c.0  0000:00:1f.0  0000:01:00.0  0000:02:0c.0  0000:04:00.0
0000:00:01.0  0000:00:14.0  0000:00:1a.0  0000:00:1c.1  0000:00:1f.3  0000:02:04.0  0000:02:10.0  0000:09:00.0
0000:00:02.0  0000:00:16.0  0000:00:1b.0  0000:00:1d.0  0000:00:1f.5  0000:02:08.0  0000:02:14.0

系统上电以后,host会自动完成上述的设备枚举过程。除一些专有系统外,普通系统只会在开机阶段进行设备的扫描。当我们安装一个 pci 设备驱动后,可以在 /sys/bus/pci/drivers 目录下找到我们安装的 pci 设备驱动模块。

[root@localhost ~]#  ls /sys/bus/pci/drivers
agpgart-intel  ata_generic  ehci-pci    i915    lpc_ich    ohci-pci   pci-stub  snd_hda_intel     xhci_hcd
agpgart-sis    ata_piix     hsw_uncore  igb     mei_me     pata_acpi  serial    uhci_hcd
agpgart-via    e1000e       i801_smbus  ioapic  mlx5_core  pcieport   shpchp    xen-platform-pci
[root@localhost ~]#
[root@localhost ~]# ls /sys/bus/pci/devices/
0000:00:00.0  0000:00:03.0  0000:00:19.0  0000:00:1c.0  0000:00:1f.0  0000:01:00.0  0000:02:0c.0  0000:04:00.0
0000:00:01.0  0000:00:14.0  0000:00:1a.0  0000:00:1c.1  0000:00:1f.3  0000:02:04.0  0000:02:10.0  0000:09:00.0
0000:00:02.0  0000:00:16.0  0000:00:1b.0  0000:00:1d.0  0000:00:1f.5  0000:02:08.0  0000:02:14.0
[root@localhost platform]# insmod  nsa_dma.ko # 安装驱动模块
[root@localhost platform]#
[root@localhost platform]# ls /sys/bus/pci/drivers  # 多出了一个 nsa_dma 驱动模块
agpgart-intel  ata_generic  ehci-pci    i915    lpc_ich    nsa_dma    pcieport  shpchp         xen-platform-pci
agpgart-sis    ata_piix     hsw_uncore  igb     mei_me     ohci-pci   pci-stub  snd_hda_intel  xhci_hcd
agpgart-via    e1000e       i801_smbus  ioapic  mlx5_core  pata_acpi  serial    uhci_hcd
[root@localhost platform]# ls /sys/bus/pci/devices/ # pci 设备数量不变,因为只会在开机阶段进行 pci 设备扫描
0000:00:00.0  0000:00:03.0  0000:00:19.0  0000:00:1c.0  0000:00:1f.0  0000:01:00.0  0000:02:0c.0  0000:04:00.0
0000:00:01.0  0000:00:14.0  0000:00:1a.0  0000:00:1c.1  0000:00:1f.3  0000:02:04.0  0000:02:10.0  0000:09:00.0
0000:00:02.0  0000:00:16.0  0000:00:1b.0  0000:00:1d.0  0000:00:1f.5  0000:02:08.0  0000:02:14.0
[root@localhost platform]#

通过 lspci -tv 命令,我们可以获得当前 linux 系统下的 pci 设备树

只有 pci 桥(包含 HOST 主桥)下,可以新开一条 pci bus 总线。因此,pci 树形结构是以 pci 桥为连接点的。

一个 pci 桥设备只能新开一条 pci bus 总线,pci bus 总线上又可以连接 pci 桥设备,继而又新开 pci bus 总线。同时,pci 扫描采用深度优先算法,因此先扫描到的 pci bus 总线,就优先编号。

你可能感兴趣的:(网络)