Warning

修改驱动然后安装的操作很危险,最好在实验的虚拟机环境中搞

查看当前网卡驱动

$ ethtool -i ens33 # 替换成自己要查询的网络接口名

Network Interface Driver

我这里显示是使用的 pcnet32 驱动

移动并卸载原有网卡驱动

$ cd /lib/modules/$(uname -r)
$ find -name "pcnet32.ko"
$ cp kernel/drivers/net/ethernet/amd/pcnet32.ko kernel/drivers/net/ethernet/amd/pcnet32.ko.backup # 备份原有驱动
$ modprobe -r pcnet32 # 移除已加载驱动
$ cd - # 回到原工作目录

下载 Linux 内核源码

$ apt-get source linux-image-unsigned-$(uname -r) # 这里是 ubuntu 20.04.3 的实验环境
$ cd linux-xxx	# 根据实际下载的名字进入到源码目录
$ grep -rsn "\<pcnet32\>" # 查找驱动对应的源代码
$ cp drivers/net/ethernet/amd/pcnet32.c .. # 将源代码单独移出到某一目录
$ cd ..
$ vim drivers/net/ethernet/amd/pcnet32.c # 做些自己的更改,如加点打印等
$ vim Makefile # 添加 Makefile,内容见下文
$ make
TARGET_MODULE:=pcnet32

ifneq ($(KERNELRELEASE),)
	obj-m := $(TARGET_MODULE).o
else
	BUILDSYSTEM_DIR := /lib/modules/$(shell uname -r)/build
	PWD := $(shell pwd)

all:
	$(MAKE) -C $(BUILDSYSTEM_DIR) M=$(PWD) modules

clean:
	$(MAKE) -C $(BUILDSYSTEM_DIR) M=$(PWD) clean
endif

安装新的驱动

$ cp pcnet32.ko /lib/modules/$(uname -r)/kernel/drivers/net/ethernet/amd
$ depmod
$ modprobe pcnet32
$ dmesg # 如加了打印,可查看到此打印信息