我正在努力理解 libibverbs 和 librxe 以及 HCA 的低级内核驱动程序之间的关系。
具体来说,我有以下疑问:
- 当数据包到达 HCA 时,低级内核驱动程序将数据包传递给用户空间应用程序。这里涉及到一个内存副本。在这张图片中,libibverbs 和 librxe 位于哪里?
- 同样,用户发出的发送命令必须能够通过低级驱动程序直接与硬件对话。在这种情况下需要用户空间库是什么?
我正在努力理解 libibverbs 和 librxe 以及 HCA 的低级内核驱动程序之间的关系。
具体来说,我有以下疑问:
InfiniBand 动词实现大致由四个组件组成:
ib_mthca
,用于 Mellanox 设备)ib_uverbs
)libmthca
)libibverbs
)之间的粘合组件InfiniBand 通常支持两种语义 - 基于数据包的操作和远程 DMA。无论操作模式如何,都通过直接读取和写入应用程序缓冲区来实现零复制。这是通过将缓冲区固定在物理内存中(也称为注册)来完成的(如 haggai_e 所述),从而防止虚拟内存管理器将其交换到磁盘或在物理 RAM 中移动它。InfiniBand 的一个非常好的特性是每个 HCA 都有自己的虚拟到物理地址转换引擎,它允许将用户空间指针直接传递给硬件。
拥有用户级驱动程序的原因是动词将 HCA 的硬件寄存器直接暴露给用户空间,并且每个 HCA 有一组不同的寄存器,因此需要一个中间用户空间层。当然,它可以完全在内核中实现,然后可以使用一个独立于供应商的用户空间库,但是 InfiniBand 非常努力地提供尽可能低的延迟,并且每次都必须通过内核将非常昂贵。RDMA 设备可以自行转换虚拟地址这一事实意味着用户空间库在工作队列中创建条目时不必通过内核来获取缓冲区的物理地址(动词使用的机制的一部分)发送和接收数据)。
请注意,基本上有两个供应商库 - 一个在内核中,一个在用户空间中。前者为文件系统(例如 Lustre)或网络协议驱动程序(例如 IP-over-InfiniBand)等其他内核模块提供动词功能,而后者在用户空间中提供该功能。一些操作不能完全在用户空间中完成,例如注册内存或打开/关闭设备上下文,并且这些操作通过 . 透明地传递给内核模块libibverbs
。
尽管技术上 RDMA over Converged Ethernet(RoCE,在用户空间中实现librxe
为
有关更多详细信息,请参阅英特尔关于在 Linux 上访问 InfiniBand 主题的摘要。
我并不librxe
特别熟悉驱动程序,但通常libibverbs
会使用它处理来自应用程序或中间件库的请求,并将其调用转发到提供程序库,例如librxe
. 提供程序库还使用内部 APIlibibverbs
将命令传递给 RDMA 内核模块(通过ib_uverbs
模块)。
以这种方式定义 RDMA 堆栈是为了允许从用户空间直接访问硬件。
编辑:在您的评论之后,我将尝试解释如何绕过从用户空间到内核的副本以及反之亦然。
使用该函数的应用程序libibverbs
将注册一个内存区域。ibv_reg_mr
此函数将调用内核命令,以便确定传递给的虚拟内存区域使用的物理内存页面ibv_reg_mr
。之后,内核驱动程序可以直接访问这些页面,而无需复制信息。
用户应用程序-> Libverbs-> librxe (SoftRoce)-> ib_core.ko -> rdma_rxe.ko -> 适配器
控制通道的路径,它告诉适配器从用户空间到哪里做 DMA。One Done ,有零拷贝 DMA 由适配器传输到远程端。