PCI总线在上世纪九十年代是主板上的绝对主力,显卡、网卡、声卡、采集卡全插在它上面。32位宽度、33MHz时钟,理论带宽133MB每秒,那个年代完全够用。
它的结构是并行共享总线,所有设备挂在同一组信号线上,谁要发数据得先抢仲裁。带宽是大家分着用的,插的卡一多就互相堵。更麻烦的是并行传输对时序要求苛刻,时钟频率往上提一点,信号偏斜和串扰就压不住了。
PCIe换了个思路,改成串行、点对点。每个设备独占一条链路,链路里可以有一条到十六条lane。Gen3的一条lane大约1GB每秒,十六条就是16GB每秒,而且是全双工,收发互不影响。
串行能赢的关键在于差分信号和时钟恢复。两根线传一个比特,靠电平差判断0和1,抗干扰能力强;接收端从数据里恢复时钟,不用再纠结并行总线那套等长布线。频率可以一路往上拉,代价是编码开销和复杂度。
PCIe分三层:事务层、数据链路层、物理层。数据打包成TLP传输,带CRC校验和重传机制,可靠性比当年的PCI强不少。配置空间也从PCI的256字节扩展到4KB,能挂更多能力和扩展结构。
枚举过程由根复合体发起,按总线号、设备号、功能号逐个扫描,给每个设备分配BAR地址空间。调试时用lspci看不到设备,先查链路训练有没有成功,再看供电和参考时钟,最后才怀疑驱动。
插槽兼容性记住一点:短的卡可以插长的槽,长的卡插不进短的槽。x1的网卡插x16的显卡槽完全没问题,只是跑x1的带宽。现在Gen5、Gen6都商用了,Gen6改用PAM4编码,信号完整性和散热成了新的麻烦事。
下一篇:没有了