1. PCIe基础回顾:PCIe体系结构、分层协议、事务层、数据链路层、物理层
好,咱们正式开始。这一章我打算带大家快速过一遍PCIe的基础知识。你可能会问:「都讲多主机拓扑和DMA了,还回顾基础干嘛?」
嗯,我个人的习惯是——不管多复杂的系统,根基一定要扎实。我在好几个项目中都遇到过,工程师对事务层理解不透,结果调试DMA时死活跑不通。说白了,PCIe的分层思想贯穿了整个设计,你躲不开的。
1.1 PCIe体系结构概览
PCIe本质上是一个高速串行总线。它取代了老旧的并行PCI总线。为什么?因为并行总线频率上不去,信号同步太难搞了。
PCIe的拓扑结构是树形的。一个Root Complex(根复合体)挂在CPU下面,下面接Switch,Switch再接Endpoint(端点设备)。
你想想看,这个结构天然就适合做多主机吗?其实不太适合。因为传统上只有一个Root Complex。但咱们后面要讲的多主机拓扑,就是在这个基础上玩出花来。
核心要点:PCIe是点对点串行连接,不是共享总线。每个设备都有自己的专用通道(Lane)。
我记得刚入行时,有个老工程师跟我说:「PCIe就是一堆高速差分对,加上一堆协议栈。」当时觉得这话太糙,现在想想,还真就是这么回事。
1.2 分层协议:拆解数据包的旅程
PCIe协议栈分三层,从下往上分别是:
- 物理层(Physical Layer):负责比特流的传输。包括电气特性、编码(8b/10b或128b/130b)、串并转换。
- 数据链路层(Data Link Layer):负责可靠传输。加CRC校验、ACK/NAK重传机制。
- 事务层(Transaction Layer):负责生成和处理事务层包(TLP)。这是咱们最关心的层。
数据从软件发出来,一路往下封装。到了物理层变成比特流,通过差分线传出去。接收端再一层层解包。
我的经验:调试DMA问题时,80%的坑都在事务层。数据链路层和物理层一般比较稳定,除非你的PCB走线太烂。
我曾经在一个项目中,DMA写操作老是超时。查了三天,最后发现是事务层的Tag分配用完了。嗯,这种问题,示波器是看不出来的,必须懂协议。
1.3 事务层(Transaction Layer)—— 重中之重
事务层是PCIe的大脑。它负责生成四种类型的TLP:
- Memory TLP:内存读写。最常用,DMA主要靠它。
- I/O TLP:I/O读写。老古董了,新设备基本不用。
- Configuration TLP:配置读写。枚举设备时用。
- Message TLP:消息中断(MSI/MSI-X)、错误报告等。
事务层还有一个关键概念——事务描述符。它包含了:
| 字段 | 说明 |
|---|---|
| Requester ID | 谁发起的请求(Bus:Device:Function) |
| Tag | 事务标签,用于匹配请求和完成 |
| Address/Length | 目标地址和数据长度 |
| Traffic Class (TC) | 优先级控制 |
说白了,事务层就是快递员。它把数据打包好,贴上地址标签,交给下一层。接收端收到后,再拆包确认。
注意:事务层不保证可靠传输。它只管发,丢了怎么办?那是数据链路层的事。别搞混了。
1.4 数据链路层(Data Link Layer)—— 可靠性的守护者
数据链路层在事务层下面。它给TLP加上了序列号(Sequence Number)和CRC校验(LCRC)。
接收端收到后,会回一个ACK或者NAK。如果收到NAK,或者超时没收到ACK,发送端就重传。
这个机制叫ACK/NAK协议。它保证了数据在物理层上传输的可靠性。
我刚开始做PCIe驱动时,总觉得数据链路层是透明的,不用管。直到有一次,我发现链路层一直在重传,导致DMA性能暴跌。查了半天,原来是物理层信号质量太差,CRC老出错。嗯,从那以后,我再也不敢忽视物理层了。
1.5 物理层(Physical Layer)—— 信号的基础
物理层分两部分:
- 逻辑子层:负责编码、加扰、链路训练。
- 电气子层:负责差分信号驱动、接收均衡。
PCIe的物理层是差分对传输。一对发送(TX),一对接收(RX)。每个Lane就是一对TX加一对RX。
链路训练(Link Training)是物理层的重要功能。设备上电后,物理层会自动协商速率和宽度。比如Gen3 x4,就是8GT/s的速率,4个Lane。
避坑指南:我曾经遇到过,Switch和Endpoint之间链路只协商到Gen2,明明两边都支持Gen3。最后发现是PCB走线太长,信号衰减太大。所以,物理层设计时,一定要留裕量。
1.6 核心知识体系:一张图看懂
下面我用一张SVG图,把PCIe的分层结构和数据流向画出来。你一看就明白了。
这张图很直观。数据从上往下封装,从下往上解包。每一层各司其职,互不干扰。这就是分层设计的好处。
1.7 小结
这一章我们回顾了PCIe的体系结构和三层协议。事务层负责生成TLP,数据链路层保证可靠传输,物理层搞定信号传输。
你可能会觉得这些基础有点枯燥。但相信我,后面讲多主机拓扑和DMA设计时,你会感谢自己今天花时间看了这一章。
嗯,下一章咱们就进入正题了——多主机拓扑到底怎么搭?我会结合我实际做过的项目来讲,保证干货满满。
课后思考:如果让你设计一个多主机系统,你会把多个Root Complex放在哪里?是挂在同一个Switch下面,还是用多个Switch互联?这个问题没有标准答案,但值得你想想。