一:对于真实的有rdma功能的网卡
首先是应用程序了,比如perftest。
1:https://github.com/linux-rdma/perftest.git
下载以后,依次执行
cd perftest/
./autogen.sh
./configure
make
make install
可以看到许多的测试命令。这些测试命令又对应代码里面的某个c文件,
比如,ib_send_bw对应send_bw.c。
这里面的代码追一下,它会调用到
https://github.com/linux-rdma/rdma-core里面的libibverbs里面的代码,里面的代码会编译为一个so文件。
对于许多的应用程序,在编程时,需要包含<infiniband/verbs.h>头文件
如果找不到相应的头文件,需要安装
安装完以后,在系统的默认头文件路径下会多了infiniband这个目录。
对于
#include <rdma/rdma_cma.h> // RDMA_CM CMA 头文件 用于CM建链
#include <rdma/rdma_verbs.h> // RDMA_CM VERBS 头文件 用于使用基于CM的Verbs接口
需要安装:
然后是
2:https://github.com/linux-rdma/rdma-core
下载以后,依次执行
git clone https://github.com/linux-rdma/rdma-core
sudo apt install libsystemd-dev -y
bash build.sh
cmake .
make
sudo make install
可以看到lib目录里面包含了许多是so
然后到providers里面的各个厂商的用户态驱动,比如bnxt_re
,它会编译为libbnxt_re-rdmaxxx.so
然后就到了内核态,
代码位置。drivers\infiniband\core
这里面有许多的ko,比较重要的是ib_core.ko和ib_uverbs.ko
通过了内核的ko以后就代码厂商的内核态驱动了,最后到硬件。
至于ib_core.ko和ib_uverbs.ko有兴趣的同学可以看一下源码,不过,我们一般比较关心的是
厂商的用户态驱动和内核态驱动,其他的一般不太关心。
所以顺序就是。
app->libibverbs.so->用户态驱动->ib_uverbs.ko->ib_core.ko->内核态驱动->硬件。
ib_uverbs.ko->ib_core.ko这两步可以先看成是一步吧。
细节要自己看了。
有些应用程序到用户态以后就直接返回了,有些则需要通过那两个ko陷入到内核态去获取信息,然后返回。
在不同的系统上,比如ubuntu上,使用
dpkg -l | grep "rdma"
命令先找到内核版本对应的rdma-core版本,然后找到相对应的用户态驱动代码,比如rxe的。
而内核态驱动对应的版本下载对应的内核源码,然后去driver/infiniband/hw目录下找就可以了。