驱动之路#65:什么是 PCIe“交织”?

科创之家 2026-09-16 7643人围观

题图:这大概是世界最危险的订婚照。一对加拿大恋人在山顶上订婚,摄影师按下快门的一瞬间,居然拍到了一道闪电。虽然照片本身很浪漫,实在太危险了。

本合集分享的是,我当初学习Linux驱动的来时路——《《驱动之路》开篇:自序&前言》。

正文

学习 PCIe 时,除了 RC、EP、BAR这些概念外,有时候还会在芯片手册或平台文档里看到一个词:交织

英文一般叫:

Interleaving

刚看到这个词时,很容易懵。

PCIe不就是高速串行总线吗?怎么还会有“交织”?它到底是在说地址交织,还是 Lane 交织?

更麻烦的是,不同文档里“交织”出现的位置不一样,含义也可能不一样。

wKgZO2qpHP2ALv-TAACgaW8yOKo777.png

有些是在讲地址映射,有些是在讲多 Lane 传输,有些是在讲平台内部 NoC / 内存 / PCIe 控制器的资源分配。

这篇就简单聊聊:PCIe 里看到“交织”时,应该怎么理解。

1. 先从字面理解“交织”

先不看 PCIe,单从字面理解。

所谓“交织”,可以理解成:不按一整块、一整段顺序处理,而是按一定粒度交替分布或交替处理。

举个简单例子。

假设有 A、B 两个仓库要处理快递。

一种方式是非交织:

先处理A仓库100个包裹;再处理B仓库100个包裹。

另一种方式是交织:

处理A的一部分;再处理B的一部分;然后再回到A;再回到B。

交织的好处是:

资源利用更均衡;并行能力更强;避免单一路径长期被占用。

但放到 PCIe 里,就不能只停留在这个类比上。

因为 PCIe 里的“交织”,可能出现在不同层面。

最容易混的,就是:

地址交织;Lane 交织。

这两个不是一回事。

2. 先说结论:地址交织 ≠ Lane 交织

可以先这样理解:

地址交织:更偏地址映射 / 系统架构层面;Lane 交织:更偏 PCIe 物理链路层面。

它们关注的对象不一样。

地址交织关心的是:某段地址访问,如何映射到不同目标、不同窗口、不同控制器或不同资源上。

Lane 交织关心的是:一个 PCIe Link 有多条 Lane 时,数据如何分布到多条 Lane 上传输。

所以不要一看到“interleaving”,就直接理解成同一种东西。

一定要看它出现在文档的哪个章节:

如果出现在 address map / ranges / ATU / region 附近,多半和地址映射有关;
如果出现在 PHY / lane / link width / LTSSM 附近,多半和物理 Lane 有关。

这个判断很重要。

3. 什么是地址交织?

地址交织不是 PCIe 独有概念。

在内存控制器、DDR 多通道、NoC、PCIe 地址窗口、DMA 地址映射里,都可能看到类似设计。

它的核心思想是:按一定地址粒度,把连续地址空间分布到不同目标资源上。

比如某个平台有两个内存通道,地址可能这样分布:

地址块0-> 通道A地址块1-> 通道B地址块2-> 通道A地址块3-> 通道B

这样 CPU 访问连续地址时,请求就能分散到不同通道,提高并行度。

放到 PCIe 相关文档里,如果它讲的是地址交织,通常更可能和这些东西有关:

PCIeoutbound addresswindow;PCIeinbound addresswindow;ATU/Region映射;NoC地址分布;多个PCIe控制器的地址窗口;系统地址空间规划。

简单说:

地址交织解决的是“地址怎么映射、资源怎么分布”的问题。

它不直接等于 PCIe 协议层面的数据传输机制。

这里要特别注意一个误区。

有人会把地址交织理解成:

多个 PCIe 设备之间轮流传输,避免一个设备独占总线。

这个说法太泛化了,不够严谨。

多设备之间的带宽分配,可能涉及:

PCIeSwitch;Root Complex;NoC;DMA;驱动队列;NVMe 多队列;RAID 软件;调度策略;系统总线仲裁。

这些不一定叫地址交织。

比如两块 NVMe SSD 做 RAID,读写请求交替下发到两块盘,这更像是软件层、块设备层、RAID 层或者 NVMe 队列层的调度。

不能简单说:

这就是 PCIe 地址交织。

如果某个 SoC 文档明确写了 PCIe address interleave,那就要结合它的上下文看:

它到底是在说 PCIe 控制器地址窗口怎么分配,还是说系统 NoC 地址如何映射。

所以更稳妥的说法是:

地址交织是一种地址映射或系统资源分布方式,具体含义依赖平台文档,不要直接等同于 PCIe 多设备公平调度。

4. 什么是 Lane 交织?

再看 Lane 交织。

PCIe 是高速串行点对点链路。

一个 PCIe Link 可以由多条 Lane 组成。

比如:

PCIex1:1条 LanePCIex2:2条 LanePCIex4:4条 LanePCIex8:8条 LanePCIex16:16条 Lane

每条 Lane 一般包含:

一对 TX 差分线;一对 RX 差分线。

也就是:

TX+TX-RX+RX-

当链路是 x4、x8、x16 这种多 Lane 时,PCIe 并不是只用其中一条 Lane 传完整数据,再换下一条 Lane。

而是会把数据分布到多条 Lane 上传输。

可以简单理解成:

数据流被拆分;分布到多条 Lane;接收端再重新对齐和组合。

这就是大家常说的 Lane striping / lane interleaving 的直观理解。

它的核心目标是:

用多条 Lane 并行提升单条 PCIe Link 的带宽。

Lane 交织解决的是单链路带宽问题——比如 PCIe 3.0 x1 和 PCIe 3.0 x4。

它们版本一样,单 Lane 能力一样。

但 x4 有 4 条 Lane,所以总带宽更高。

可以粗略理解为:

x1:一条车道;x4:四条车道;x16:十六条车道。

Lane 越多,并行传输能力越强。

所以 Lane 交织关注的是:

同一条 PCIe Link 内部;多条 Lane 如何共同承载一个数据流;接收端如何恢复顺序;如何处理 Lane 间时延差异。

这和地址交织完全不是一个层面的东西。

一句话:

地址交织看地址怎么分;Lane 交织看数据怎么走线。

5. 总结

PCIe 里的“交织”不能一概而论。

最常见要区分两类:

地址交织;Lane 交织。

更准确地说:

地址交织:关注地址空间如何映射和分布;Lane 交织:关注多 Lane 链路中数据如何分布到物理通道上传输。

它们的区别可以用一句话记住:地址交织管“地址怎么分”,Lane 交织管“数据怎么走”。

如果在 dts、ranges、ATU、Region 附近看到交织,多半是在说地址映射。

如果在 PHY、Lane、Link Width、LTSSM 附近看到交织,多半是在说物理链路。

实际调试时也要分开看:

BAR/ resource /nospace:优先看地址窗口;Link down / Width 不对 / Speed 降级:优先看 Lane 和链路训练。

最后再强调一句:

不要把地址交织简单理解成多设备公平调度,也不要把 Lane 交织简单理解成 Lane 坏了还能无感容错。

PCIe 很复杂,很多词要放回具体上下文里看。

先分清层次,再看具体问题,学习和调试都会清楚很多。

(完)

审核编辑 黄宇

  • 随机文章
  • 热门文章
  • 热评文章
不容错过
Powered By Z-BlogPHP