我正在努力理解libibverbs和librxe之间的关系以及HCA的低级内核驱动程序.
具体来说,我有以下疑问:
当数据包到达HCA时,低级内核驱动程序将数据包传递给用户空间应用程序.这里有一个内存副本.在这张图片中,libibverbs和librxe在哪里?
类似地,用户发出的发送命令必须能够通过低级驱动程序直接与硬件通信.在这种情况下,需要拥有用户空间库是什么?
Hristo Iliev.. 5
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(RoCE,在用户空间中实现librxe
)不是硬件级别的InfiniBand,但OpenFabrics堆栈的设计方式是支持除InfiniBand HCA之外的支持RDMA的硬件,包括RoCE和iWARP适配器.
有关更多详细信息,请参阅英特尔关于在Linux上访问InfiniBand主题的摘要.
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(RoCE,在用户空间中实现librxe
)不是硬件级别的InfiniBand,但OpenFabrics堆栈的设计方式是支持除InfiniBand HCA之外的支持RDMA的硬件,包括RoCE和iWARP适配器.
有关更多详细信息,请参阅英特尔关于在Linux上访问InfiniBand主题的摘要.