RDMA 的软件架构按层次可分成两部分,即 rdma-core 和内核 RDMA 子系统,分别运行在 Linux 系统中的用户态和内核态。整个软件架构适用于所有类型的 RDMA 网卡,不管网卡执行了哪种 RDMA 协议(InfiniBand/RoCE/ iWARP)。
一、rdma-core
rdma-core 是开源的 RDMA 用户态软件包,包含了各种子功能动态库、不同厂商网卡的用户态驱动程序、API 帮助手册以及测试工具等,并提供 Verbs API 给应用程序调用。
rdma-core 的代码可在 GitHub 网站获取:rdma-core
其代码根目录中有以下内容:
rdma-core$ tree -L 1
.
├── buildlib
├── build.sh
├── ccan
├── CMakeLists.txt
├── COPYING.BSD_FB
├── COPYING.BSD_MIT
├── COPYING.GPL2
├── COPYING.md
├── debian
├── Documentation
├── ibacm
├── infiniband-diags
├── iwpmd
├── kernel-boot
├── kernel-headers
├── libibmad
├── libibnetdisc
├── libibumad
├── libibverbs
├── librdmacm
├── MAINTAINERS
├── providers
├── pyverbs
├── rdma-ndd
├── README.md
├── redhat
├── srp_daemon
├── suse
├── tests
└── util
比较重要的几个目录
二、内核RDMA子系统
内核 RDMA 子系统指的是开源的Linux 内核代码中和 RDMA 有关的子系统,包含 RDMA内核框架及各厂商的 RDMA 网卡驱动程序。内核 RDMA 子系统是 Linux 内核的一部分,随 Linux 内核的代码进行维护。其一方面提供内核态的 Verbs API 给其他内核模块使用,另一方面对接用户态的 Verbs API。
内核 RDMA 子系统在操作系统中生成了如下 3 个设备文件,供用户态的程序访问。
rdma-core 中包含了访问这三个文件的用户态库,所以应用程序一般不直接访问它们。
- /dev/infiniband/uverbsX(libibverbs)
- /dev/infiniband/rdma_cm(librdmacm)
- /dev/infiniband/umadX(libibumad)
内核 RDMA 子系统的代码位于 Linux 内核的 drivers/infiniband 目录下。虽然目录名为
infiniband,但实际为所有的 RDMA 网络协议共用。
linux-5.8.1/drivers/infiniband$ tree -L 1
.
├── core
├── hw
├── Kconfig
├── Makefile
├── sw
└── ulp
core:内核RDMA子系统的核心,整合整个子系统,支撑用户态组件。向上对接用户态Verbs API,向下对接内核态的设备驱动程序。
sw:包含具有特殊功能的软件模块,比如Soft-Roce,用于在普通以太网卡上搭建虚拟RDMA操作环境。
hw:RDMA网卡的内核态驱动程序
三、RDMA软件架构总览
完整版
简化版