最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

天天新动态:openeuler加载dpdk驱动模块

来源:博客园

虽然是openeuler arm架构加载dpdk网卡驱动,但是linux加载驱动模块的流程和方法是一样的,遇到的问题也是相似的,所以借这个机会把相关的内容介绍一下

确认模块名称

驱动模块开发完成后是一个ko库,拷贝到系统指定目录,然后运行命令加载模块名。有时候想知道源码编译的模块名称是什么,可以在在源码的Makefile文件中:

## module name and path#MODULE = igb_uioMODULE_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 byib_uverbs             327680  1 rdma_ucmib_iser               262144  0rdma_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.koauthor:         Intel Corporationlicense:        GPLdescription:    UIO driver for Intel IGB PCI cardssrcversion:     26C63DAE2104091D5DE47C6depends:        uioname:           igb_uiovermagic:       4.19.90-2110.8.0.0119.oe1.aarch64 SMP mod_unload modversions aarch64parm:           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.0dpdk-devbind是dpdk编译安装的工具,上面就是把igb_uio驱动绑定到指定的网卡bus info中

查看网卡状态

dpdk-devbind -sNetwork devices using DPDK-compatible driver============================================0000:c6:00.0 "Hi1822 Family (4*25GE) 1822" drv=igb_uio unused=hinicNetwork 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 -rmodinfo 模块名查看系统内核与模块的vermagic值是否相同。

$ uname -r4.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.koauthor:         Intel Corporationlicense:        GPLdescription:    UIO driver for Intel IGB PCI cardssrcversion:     26C63DAE2104091D5DE47C6depends:        uioname:           igb_uiovermagic:       4.19.90-2110.8.0.0119.oe1.aarch64 SMP mod_unload modversions aarch64parm:           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)"

关键词: 网卡驱动 遇到问题 系统内核