相关名词
RC | Root Complex |
BAR | Base Address Register |
BDF | Bus+Device+Function组成ID用来定义pci设备id。PCIe系统,最大支持256条Bus,每条Bus上可以挂最多32个Device,而每个Device最多又能实现8个Function,而每个Function对应着4KB的配置空间。上电的时候,这些配置空间都是需要映射到Host的内存空间,因此,需要占用内存空间是:256*32*8*4KB =256MB。 |
TLP | Transaction Layer Packet 。TLP都是生于发送端的事务层(Transaction Layer),终于接收端的事务层。 |
pcie 速率
GT/s —— Giga transation per second (千兆传输/秒)
真实的传输速率和编码方案有关系,例如pcie2.0使用8b/10b编码方案,即每次发送8个bit需要发送10个bit,其中2个bit对上层是没用的。所以 PCIe 2.0协议的每一条Lane支持 5 * 8 / 10 = 4 Gbps = 500 MB/s 的速率。
网卡速率可以通过lspc -s 00.05.0 -vvv 查看speed。从speed可以反推pcie 的版本。
pcie 理解
Type 0是Endpoint的配置,Type 1是Bridge(PCIe时代就是Switch)的配置。
Device ID,Vendor ID,Class Code(表明类别网卡、bridge等)和Revision ID(修订版本),是只读寄存器。
Endpoint Configuration(Type 0),提供了最多6个BAR,而对Switch(Type 1)来说,只有2个。
这6个BAR是为了不同的功能而划分的不通空间。一般是3种不通的功能。
- memory BAR 位于内存空间,可以通过mmap 映射访问
- io BAR 位于io空间,需要特殊访问io指令访问
- msi-x BAR 用于msi-x中断向量配置空间
BAR空间通过/sys/bus/pci/devices/[pci_addr]/resource 接口展示,有三列. 只读
第一列为PCI BAR起始地址
第二列为PCI BAR终止地址
第三列为这个PCI BAR的标识
对应这struct resource
上图中resource0 表示 BAR0的空间的 , resource2表示 BAR2空间 。可读写
下图描述pci_dev 和 resource 及dpdk中igb_uio 结构体之间的关系。
从crash 工具中可以看到resource 结构中的成员变量
可以看大name其实就是我们常说的pci 号,
flags 用来标识属于什么类型等,例如flags中含有0x200 标识memoy BAR。 ioport.h中定义了很多flag 宏
parent则是父 pci bus
sibling是相邻的另外一个pci resource
这3中BAR空间会根据位数的不同而又不同布局,例如:32位可能分别对应1,3,5 剩下的的2,4,6则预留。64位则每种空间2个。
由于256位无法描述pcie的强大,pcie扩展为4KB, 前256位保持不变。
cpu要读去EP的内容需要经过以下几个步骤
1) RC通过TLP(经过switch)交互获取数据
2)RC将获取的数据保存在内存中
3) CPU通过访存的方式间接的获取EP的内容。
引用
https://www.cnblogs.com/jungle1996/p/12398915.html
http://www.ssdfans.com/?p=8210