【原创】Linux PCI驱动框架分析(一) (3)

Root Complex:CPU和PCIe总线之间的接口可能会包含几个模块(处理器接口、DRAM接口等),甚至可能还会包含芯片,这个集合就称为Root Complex,它作为PCIe架构的根,代表CPU与系统其它部分进行交互。广义来说,Root Complex可以认为是CPU和PCIe拓扑之间的接口,Root Complex会将CPU的request转换成PCIe的4种不同的请求(Configuration、Memory、I/O、Message);

Switch:从图中可以看出,Swtich提供扇出能力,让更多的PCIe设备连接在PCIe端口上;

Bridge:桥接设备,用于去连接其他的总线,比如PCI总线或PCI-X总线,甚至另外的PCIe总线;

PCIe Endpoint:PCIe设备;

图中白色的小方块代表Downstream端口,灰色的小方块代表Upstream端口;

前文提到过,PCIe在软件上保持了后向兼容性,那么在PCIe的设计上,需要考虑在PCI总线上的软件视角,比如Root Complex的实现可能就如下图所示,从而看起来与PCI总线相差无异:

Root Complex通常会实现一个内部总线结构和多个桥,从而扇出到多个端口上;

Root Complex的内部实现不需要遵循标准,因此都是厂家specific的;

而Switch的实现可能如下图所示:

Switch就是一个扩展设备,所以看起来像是各种桥的连接路由;

3.2 PCIe数据传输

与PCI总线不同(PCI设备共享总线),PCIe总线使用端到端的连接方式,互为接收端和发送端,全双工,基于数据包的传输;

物理底层采用差分信号(PCI链路采用并行总线,而PCIe链路采用串行总线),一条Lane中有两组差分信号,共四根信号线,而PCIe Link可以由多条Lane组成,可以支持1、2、4、8、12、16、32条;

PCIe规范定义了分层的架构设计,包含三层:

Transaction层

负责TLP包(Transaction Layer Packet)的封装与解封装,此外还负责QoS,流控、排序等功能;

Data Link层

负责DLLP包(Data Link Layer Packet)的封装与解封装,此外还负责链接错误检测和校正,使用Ack/Nak协议来确保传输可靠;

Physical层

负责Ordered-Set包的封装与解封装,物理层处理TLPs、DLLPs、Ordered-Set三种类型的包传输;

数据包的封装与解封装,与网络包的创建与解析很类似,如下图:

封装的时候,在Payload数据前添加各种包头,解析时是一个逆向的过程;

来一个更详细的PCIe分层图:

3.3 PCIe设备的配置空间

为了兼容PCI软件,PCIe保留了256Byte的配置空间,如下图:

此外,在这个基础上将配置空间扩展到了4KB,还进行了功能的扩展,比如Capability、Power Management、MSI中断等:

扩展后的区域将使用MMIO的方式进行访问;

草草收场吧,对PCI和PCIe有一些轮廓上的认知了,可以开始Source Code的软件分析了,欲知详情、下回分解!

参考

《PCI Express Technology 3.0》
《pci local bus specification revision 3.0》
《PCIe体系结构导读》
《PCI Express系统体系结构标准教材》

欢迎关注个人公众号,不定期分享Linux内核相关技术文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwjyxj.html