虽然是openeuler arm架构加载dpdk网卡驱动,但是linux加载驱动模块的流程和方法是一样的,遇到的问题也是相似的,所以借这个机会把相关的内容介绍一下
确认模块名称
驱动模块开发完成后是一个ko库,拷贝到系统指定目录,然后运行命令加载模块名。有时候想知道源码编译的模块名称是什么,可以在在源码的Makefile
文件中:
#
# module name and path
#
MODULE = igb_uio
MODULE_PATH = drivers/net/igb_uio
以dpdk的为例,这里有明确的指出,模块的名称和位置,但是MODULE
并不是关键字,是dpdk的一个变量,可以在编译文件中查找*.ko
结尾的内容来确认名称,比如dpdk的:
_BUILD = $(MODULE).ko
insmod
insmod只会加载指定路径下的某个模块,不会解决依赖,比如insmod /home/test/dev/igb_uio.ko
modprobe
modprobe会帮忙解决依赖,也就是如果加载a模块需要b模块,那么会先加载b模块,再加载a模块,比如modprobe igb_uio
。
modprobe不需要指定具体路径,但是你必须要把你的模块放到系统指定目录/lib/modules/#uname -r#/
,这个路径不是固定的,会根据不同的系统而不一样,uname -r
就是后面的目录名称。
depmod
depmod会扫描模块,把结果写入/lib/modules/#uname -r#/modules.dep
文件中,如果安装一个新模块,需要先运行depmod扫描,再运行modprobe加载,不然会报错FATAL: Module test.ko not found in directory /lib/modules/xxx
lsmod
列出系统中安装的模块,内容有三列,第一列是模块名,第二列是模块大小,第三列是模块被谁调用
Module Size Used by
ib_uverbs 327680 1 rdma_ucm
ib_iser 262144 0
rdma_cm 262144 6 rpcrdma,ib_srpt,ib_srp,ib_iser,ib_isert,rdma_ucm
modinfo
查看模块的信息,可以指定具体路径,也可以只指定
$ modinfo igb_uio
filename: /lib/modules/4.19.90-2003.4.0.0036.oe1.aarch64/extra/dpdk/igb_uio.ko
author: Intel Corporation
license: GPL
description: UIO driver for Intel IGB PCI cards
srcversion: 26C63DAE2104091D5DE47C6
depends: uio
name: igb_uio
vermagic: 4.19.90-2110.8.0.0119.oe1.aarch64 SMP mod_unload modversions aarch64
parm: intr_mode:igb_uio interrupt mode (default=msix):
msix Use MSIX interrupt
msi Use MSI interrupt
legacy Use Legacy interrupt
(charp)
rmmod
删除模块,如果模块不需要了,或者想替换新的模块,需要用rmmod删除,命令如下rmmod igb_uio
module_init module_exit
这两个函数注册两个接口,用作加载和卸载模块的时候调用
module_init(mymodule_init);
module_exit(mymodule_exit);
绑定驱动
dpdk-devbind -b igb_uio 0000:c6:00.0
dpdk-devbind是dpdk编译安装的工具,上面就是把igb_uio驱动绑定到指定的网卡bus info中
查看网卡状态
dpdk-devbind -s
Network devices using DPDK-compatible driver
============================================
0000:c6:00.0 'Hi1822 Family (4*25GE) 1822' drv=igb_uio unused=hinic
Network devices using kernel driver
===================================
0000:7d:00.0 'HNS GE/10GE/25GE RDMA Network Controller a222' if=enp125s0f0 drv=hns3 unused=hns_roce_hw_v2,igb_uio *Active*
0000:7d:00.1 'HNS GE/10GE/25GE Network Controller a221' if=enp125s0f1 drv=hns3 unused=hclge,igb_uio
0000:7d:00.2 'HNS GE/10GE/25GE RDMA Network Controller a222' if=enp125s0f2 drv=hns3 unused=hns_roce_hw_v2,igb_uio
0000:7d:00.3 'HNS GE/10GE/25GE Network Controller a221' if=enp125s0f3 drv=hns3 unused=hclge,igb_uio
0000:c3:00.0 'Hi1822 Family (4*25GE) 1822' if=enp195s0 drv=hinic unused=igb_uio
0000:c4:00.0 'Hi1822 Family (4*25GE) 1822' if=enp196s0 drv=hinic unused=igb_uio
0000:c5:00.0 'Hi1822 Family (4*25GE) 1822' if=enp197s0 drv=hinic unused=igb_uio
0000:dd:00.0 'HNS GE/10GE/25GE RDMA Network Controller a222' if=enp221s0f0 drv=hns3 unused=hns_roce_hw_v2,igb_uio
可以看到0000:c6:00.0
这个网卡已经是dpdk的驱动了。
绑定dpdk驱动后,网卡会被dpdk接管,使用ifconfig
就无法查看到网卡信息和名称。
解绑网卡驱动
dpdk-devbind -u 0000:c6:00.0
绑定系统原来驱动
这一步需要知道系统原来驱动名称,可以在最开始调用ethtool -i 网卡名
查看
遇到问题
modprobe: ERROR: could not insert 'igb_uio': Invalid argument
当前系统的内核和编译模块内核不匹配,通过uname -r
和modinfo 模块名
查看系统内核与模块的vermagic值是否相同。
$ uname -r
4.19.90-2003.4.0.0036.oe1.aarch64
$ modinfo igb_uio
filename: /lib/modules/4.19.90-2003.4.0.0036.oe1.aarch64/extra/dpdk/igb_uio.ko
author: Intel Corporation
license: GPL
description: UIO driver for Intel IGB PCI cards
srcversion: 26C63DAE2104091D5DE47C6
depends: uio
name: igb_uio
vermagic: 4.19.90-2110.8.0.0119.oe1.aarch64 SMP mod_unload modversions aarch64
parm: intr_mode:igb_uio interrupt mode (default=msix):
msix Use MSIX interrupt
msi Use MSI interrupt
legacy Use Legacy interrupt
(charp)
parm: wc_activate:Activate support for write combining (WC) (default=0)
0 - disable
other - enable
(int)
这时候可以查看一下自己系统上安装的kernel-devel
与系统内核版本uname -r
是否匹配,如果不匹配,先卸载kernel-devel
,再安装指定版本yum install "kernel-devel-uname-r == $(uname -r)"