
pcie 3.0规范翻译数据链路层负责将事务层提供的 TLPTransaction Layer Packets事务层数据包可靠地跨越 PCI Express 链路传输到对端组件的事务层。数据链路层提供的服务包括数据交换接收来自发送端事务层用于传输的 TLP并将其传递给发送端物理层接收从物理层通过链路收到的 TLP并将其传递给接收端事务层错误检测与重传TLP 序列号和 LCRC链路循环冗余校验的生成为数据链路层重传存储已发送的 TLP对 TLP 和数据链路层数据包DLLP进行数据完整性检查正向和负向确认 DLLPAck/Nak用于错误报告和日志机制的错误指示链路确认超时重放机制初始化与电源管理跟踪链路状态并将活跃/复位/断开状态告知事务层数据链路层数据包DLLP用于链路管理功能包括 TLP 确认、电源管理以及流控信息的交换在链路上两个直接相连组件的数据链路层之间传输DLLP 以点对点方式在一条链路上的两个组件之间发送。而 TLP 则从一个组件路由到另一个组件可能经过一个或多个中间组件。DLLP 和 TLP 的数据完整性检查通过每个跨链路发送的数据包中包含的 CRC 来完成。DLLP 使用 16 位 CRC而 TLP其长度可能远大于 DLLP使用 32 位 LCRC。此外TLP 还包含一个序列号用于检测一个或多个完整 TLP 丢失的情况。CRC 校验失败的已接收 DLLP 将被丢弃。使用 DLLP 的机制可能会因这种信息丢失而遭受性能损失但它们具备自修复能力即后续的 DLLP 将取代任何丢失的信息。数据完整性检查LCRC 和序列号失败或在从一个组件传输到另一个组件过程中丢失的 TLP将由发送端重新发送。发送端会存储所有已发送 TLP 的副本在需要时重新发送这些副本并且仅在收到来自对端组件的无误接收正向确认后才清除这些副本。如果在指定时间内未收到正向确认发送端将自动开始重传。接收端可以使用负向确认请求立即重传。对于事务层而言数据链路层表现为一个具有可变延迟的信息通道。在任何一条给定的链路上所有输入到发送端数据链路层图 3-1 中的 1 和 3的 TLP都会在稍后以相同的顺序出现在接收端数据链路层图 3-1 中的 2 和 4的输出端如图 3-1 所示。延迟取决于多种因素包括流水线延迟、链路的宽度和工作频率、跨链路的电信号传输以及由数据链路层重传引起的延迟。由于这些延迟的存在发送端数据链路层1 和 3可以向发送端事务层施加反压backpressure而接收端数据链路层2 和 4则向接收端事务层通知有效信息的存在与否。关键术语注释TLPTransaction Layer Packet事务层数据包PCIe 中承载业务数据的核心载体。DLLPData Link Layer Packet数据链路层数据包用于链路管理确认、流控、电源管理仅在本地链路点对点传输不被路由。LCRCLink CRC链路循环冗余校验32 位 CRC用于单跳链路的 TLP 完整性校验每经过一个 Switch 重新计算。Sequence Number序列号数据链路层为每个 TLP 分配的序号用于检测 TLP 丢失和乱序。Ack/Nak正向/负向确认 DLLP接收端通过 Ack 确认无误接收通过 Nak 请求立即重传。Backpressure反压当发送端数据链路层缓冲区满或链路拥塞时向上层事务层传递的暂停发送信号。进入L0 后 如何进行数据链路层的连接物理层 LTSSM 进入 L0 只是路修好了数据链路层还需要完成一系列握手和初始化才能宣告可以通车了。这个过程由DLCMSMData Link Control and Management State Machine状态机负责三种核心状态States原文定义了 DLCMSM 的三种状态这构成了数据链路层连接建立的生命周期DL_Inactive非激活状态原文Physical Layer reporting Link is non-operational or nothing is connected to the Port解读这是默认/复位状态。意味着物理层告诉数据链路层“链路还没通或者根本没有插线。”此时数据链路层处于休眠/关闭状态不处理任何 TLP。DL_Init初始化状态原文Physical Layer reporting Link is operational, initialize Flow Control for the default Virtual Channel解读这就是我们刚才讨论的“连接建立”阶段。当物理层 LTSSM 成功进入 L0reporting Link is operational时数据链路层就会跳转到这里。在此状态下它会立刻对默认的虚拟通道VC0进行流控Flow Control的初始化交换。DL_Active激活状态原文Normal operation mode解读流控初始化完成后正式进入正常工作模式。开始正常收发 TLP、发送/接收 Ack/Nak DLLP、处理重传等。二、 两种对外输出状态Status Outputs数据链路层内部的状态机流转最终会抽象成两个信号通知给上层的“事务层”和下层的“物理层”告诉它们当前链路是否可用DL_Down链路断开原文The Data Link Layer is not communicating with the component on the other side of the Link.解读对应DL_Inactive状态。事务层收到这个信号就知道不要发数据过来了。DL_Up链路连接原文The Data Link Layer is communicating with the component on the other side of the Link.解读对应DL_Init完成后进入的DL_Active状态。事务层收到这个信号就知道“路通了”可以开始发业务数据TLP了。总结你贴出的这段规范清晰地勾勒出了 PCIe 物理层LTSSM和数据链路层DLCMSM的完美配合物理层先把路修好LTSSM 进入 L0然后告诉数据链路层“Link is operational”。数据链路层收到通知从DL_Inactive跳到DL_Init去初始化流控最后跳到DL_Active并对外输出DL_Up。事务层看到DL_Up开始发车。总结三层分工明确如果把 PCIe 链路比作一条高速公路的开通物理层LTSSM负责修路、铺沥青、划线进入 L0。数据链路层DLCMSM负责安装红绿灯、测试信号灯是否正常进入 DL_Active输出DL_Up。事务层它不修路也不装红绿灯。它只是停在起点的一辆卡车司机。当它看到绿灯亮起DL_Up并且自己已经加满了油初始化流控 Credit它才会开始踩油门发送 TLP。PCIe 协议栈的数据链路层DLCMSM 状态机、TLP 序列号管理、ACK/NAK 重传、流控信用初始化全部由硬件 IP 核Root Complex / Endpoint 控制器内部实现。LINUX内核不干预 LTSSM 状态跳转或 DLCMSM 的DL_Init/DL_Active迁移。我的理解数据链路层建立连接后pcie RC 对 EP 进行枚举通过读写 BAR 寄存器探测大小并在系统内存地址空间中为其分配一段物理地址作为映射入口建立 BAR 映射。后续当主机需要与 EP 交互时事务层将数据打包并将 BAR 映射地址作为目标地址封装进 TLP大卡车通过链路发送给 EPEP 收到后解析地址将数据卸入其内部对应的物理存储空间中。