欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

PCIe 从头开始 (11) - 数据链路层简介

最编程 2024-10-06 19:28:46
...

一、概述

        数据链路层这一层的逻辑是用来负责链路管理的,它主要表现为 3 个功能TLP 错误纠正、流量控制以及一些链路电源管理。它是通过如图 2-24 所示的DLLP(Data Link Layer Packet)来完成这些功能的。

二、DLLPs 数据链路层包(Data Link Layer Packet)

        DLLPs(数据链路层数据包)在链路上两个相邻设备的数据链路层之间传输,事务层对此类数据包并不知晓。DLLPs仅在相邻设备之间传递,并不会被路由到其他地方。与TLP(事务层数据包)相比,DLLPs的体积很小(始终只有8字节),这是一个优势,因为它们属于维持链路协议的开销,较小的大小有助于减少资源消耗。

2.1 DLLP组包

        DLLP(数据链路层数据包)的组包过程如图2-24所示,起源于发送端的数据链路层,并由接收端的数据链路层处理。为确保在接收端检查错误,DLLP核心部分附加了一个16位的CRC校验码。随后,DLLP的内容被转发至物理层,物理层会在包的开头和结尾附加起始和结束字符(适用于PCIe的前两代),然后对数据进行编码并通过所有可用通道以差分方式传输。

2.2 DLLP解包

        当DLLP到达物理层时,物理层会对接收到的位流进行解码,并移除起始和结束字符。随后,剩余的数据包被转发至数据链路层,数据链路层检查是否存在CRC错误,并根据数据包的内容采取相应的操作。由于数据链路层是DLLP的最终目的地,因此DLLP不会被传递到事务层。

三、Ack/Nak 协议(Ack/Nak Protocol)

        Ack/Nak协议提供了硬件层面上的自动重传机制,以实现错误校正功能,如图2-25所示。每个发出的TLP都会附加一个LCRC(链路层循环冗余校验码)和序列号,在接收端进行校验。发送端的重播缓冲区保存每个已发送的TLP副本,直到收到来自相邻设备的确认信息。确认信息是接收端发送的一个Ack DLLP(正确认)数据包,包含最后一个正确接收的TLP的序列号。

        当发送端接收到Ack时,它会将该序列号及之前的所有TLP从重播缓冲区中移除。如果接收端检测到TLP错误,它会丢弃该TLP并向发送端返回Nak(负确认),发送端随后将重新发送所有未被确认的TLP,希望下一次传输能够成功。由于检测到的错误大多是瞬时的,因此重播通常能解决问题。这个过程通常称为Ack/Nak协议。

四、DLLP基本形式

        DLLP的基本形式如图2-26所示,包含一个4字节的DLLP类型字段(可能包含其他信息)和一个2字节的CRC。图2-27展示了通过交换机的内存读取操作,通常情况下步骤如下:

  1. 步骤1a:请求方(Requester)发送一个内存读取请求(MRd TLP),并在其重播缓冲区中保存一份副本。交换机收到MRd TLP后,检查LCRC和序列号。步骤1b:未发现错误,因此交换机向请求方返回一个Ack DLLP,随后请求方从其重播缓冲区中删除该TLP的副本。

  2. 步骤2a:交换机将MRd TLP转发到正确的出口端口(Egress Port),并使用内存地址进行路由,同时在出口端口的重播缓冲区中保存一份副本。最终响应方(Completer)收到MRd TLP并检查是否有错误。步骤2b:未发现错误,因此响应方向交换机返回一个Ack DLLP,交换机端口从其重播缓冲区中清除MRd TLP的副本。

  3. 步骤3a:作为请求的最终目标,响应方检查MRd TLP中的可选ECRC字段。未发现错误,因此请求被传递给核心逻辑。根据命令,设备获取请求的数据并返回带有数据的完成包(CplD TLP),同时将其副本保存到重播缓冲区中。交换机收到CplD TLP并检查是否有错误。步骤3b:未发现错误,因此交换机向响应方返回一个Ack DLLP,响应方将其重播缓冲区中的CplD TLP副本删除。

  4. 步骤4a:交换机解码CplD TLP中的请求方ID字段,并将数据包路由到正确的出口端口,同时在出口端口的重播缓冲区中保存一份副本。请求方收到CplD TLP并检查是否有错误。步骤4b:未发现错误,随后请求方向交换机返回一个Ack DLLP,交换机从其重播缓冲区中清除CplD TLP的副本。请求方检查可选的ECRC字段,未发现错误,因此数据被传递给核心逻辑。