HCA 的 MMIO 空间的确切内容和使用将取决于供应商,也可能取决于卡。实现 RDMA 以使卡及其驱动程序设置直接对应于远程映射内存的 MMIO 区域似乎确实是一种简单的方法。但是,将 MMIO 区域视为与远程内存相同的一个区域仅在一定的抽象级别上是正确的,可能在Infiniband 动词库(pdf) 层或更高层。
在该级别之下,由主机 A 上的应用程序发布的、发往主机 B 的 RDMA 写入所遍历的协议栈将如下所示:
- 在 A 上执行的代码会移动到 MMIO 地址。
- A 的 CPU 插槽上的内存管理硬件将地址识别为 PCIe MMIO,如果 HCA 插入适当的插槽,则直接从 CPU 插槽向 PCIe 发送请求,或者作为DMI数据包或类似的数据包发送到南桥,然后依次将 PCIe 传输到 HCA。
- HCA 从 PCIe 数据包中解包 RDMA 有效负载,并执行它需要做的任何事情来处理将该信息发送到 Infiniband 结构。这很可能涉及在 HCA 本身的一些小内存中缓冲负载一小段时间,然后在 IB 数据包中发送 RDMA 请求。
遍历 IB 结构后,有效负载在 B 上遵循大致相反的一系列步骤:
- B 的 HCA 接收 IB 数据包并解包有效负载。
- HCA 可能会在构建 PCIe 数据包时将有效负载缓存在卡上一小段时间。
- PCIe 数据包穿过 B 的主板,可能会一路转换为 DMI 或其他格式,然后到达 B 的 DMA 控制器。
- B 的 DMA 控制器仲裁将有效负载写入固定用于此类 RDMA 事务的 B 的系统内存区域。
使 RDMA 比竞争技术更快的关键步骤是 B4。在发生任何 RDMA 读取或写入之前,B 上的 Infiniband 驱动程序和动词库会设置一个内存区域,以便 B 的 DMA 控制器能够安全地对其进行写入,而无需任何进一步的上下文切换或操作系统或驱动程序处理。这意味着除了有线传输增加的延迟(通常在微秒级)之外,接收端的处理给事务增加的延迟非常小。此步骤和 A 上相应的 MMIO 映射也允许零拷贝传输,其中任何一方都不必在内核和用户空间之间复制感兴趣的内存,以在 HCA、驱动程序和应用程序之间进行中间处理。
如果您调用 IB 动词,这是一个很好的链接,描述了它在软件级别的外观:
http://thegeekinthecorner.wordpress.com/2010/09/28/rdma-read-and-write-with-ib-verbs/