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