2. 编写第一个字符设备驱动
任务说明
本案例目标是在Linux系统中,使用modprobe和rmmod命令完成指定网卡驱动模块的加载与卸载,并通过系统日志验证操作结果。以e1000网卡驱动为例(Intel千兆网卡常见驱动),完成从模块加载到卸载的完整闭环。
环境准备
操作前确认系统已安装e1000驱动模块,且当前未加载。使用以下命令检查模块文件是否存在:
ls /lib/modules/$(uname -r)/kernel/drivers/net/ethernet/intel/e1000/e1000.ko*
若文件存在,继续后续操作。若不存在,需先安装对应内核模块包(如apt install linux-modules-extra-$(uname -r))。
操作步骤与代码
以下命令序列完成模块加载、状态确认、卸载及日志验证。所有命令需以root权限执行(使用sudo或root shell)。
# 1. 查看模块当前是否已加载(预期无输出)
lsmod | grep e1000
# 2. 使用modprobe加载模块(自动处理依赖)
modprobe e1000
# 3. 确认模块已加载(预期显示e1000条目)
lsmod | grep e1000
# 4. 查看模块详细信息(可选,确认参数与依赖)
modinfo e1000 | head -20
# 5. 使用rmmod卸载模块
rmmod e1000
# 6. 确认模块已卸载(预期无输出)
lsmod | grep e1000
系统日志验证
模块加载与卸载会触发内核日志记录。使用dmesg查看相关日志,确认操作真实生效:
# 查看最近的内核日志(加载与卸载记录)
dmesg | tail -20
预期日志中应包含类似以下内容(具体行号与时间戳因系统而异):
[12345.678901] e1000: Intel(R) PRO/1000 Network Driver - version 7.3.21-k8-NAPI
[12345.678905] e1000: Copyright (c) 1999-2006 Intel Corporation.
[12345.679012] e1000 0000:02:01.0: PCI INT A -> GSI 19 (level, low) -> IRQ 19
[12345.679123] e1000 0000:02:01.0: setting latency timer to 64
[12345.679234] e1000 0000:02:01.0: eth0: (PCI:33MHz:32-bit) 08:00:27:xx:xx:xx
[12345.679345] e1000 0000:02:01.0: eth0: Intel(R) PRO/1000 Network Connection
[12345.679456] e1000 0000:02:01.0: eth0: MAC: 08:00:27:xx:xx:xx, IP: 0.0.0.0
[12345.679567] e1000 0000:02:01.0: PCI INT A disabled
其中e1000: Intel(R) PRO/1000 Network Driver为驱动加载时的版本信息,eth0相关行表示驱动已绑定到网卡设备,最后一行PCI INT A disabled表示卸载时中断释放。若系统无实际e1000网卡硬件,则日志中不会出现设备绑定行,但仍会显示驱动加载与卸载的版本信息。
验证方法与判定标准
按以下步骤验证案例是否成功:
- 加载验证:执行
modprobe e1000后,运行lsmod | grep e1000,若输出包含e1000条目,说明模块已加载。 - 日志验证:执行
dmesg | tail -20,若看到驱动版本信息(如e1000: Intel(R) PRO/1000 Network Driver),说明加载动作已记录。 - 卸载验证:执行
rmmod e1000后,再次运行lsmod | grep e1000,若无输出,说明模块已卸载。 - 卸载日志验证:再次执行
dmesg | tail -5,若看到类似e1000 0000:02:01.0: PCI INT A disabled或e1000: driver unloaded的信息,说明卸载动作已记录。
判定标准:上述4项检查全部通过,且lsmod结果与dmesg日志相互印证,即可确认模块加载与卸载操作成功。
注意事项
- 若系统当前正在使用e1000驱动的网卡(如通过SSH连接),卸载会失败并提示
Module is in use。此时需先停止网络服务或改用其他网卡连接。 - 若使用
rmmod卸载失败,可尝试modprobe -r e1000,后者会同时处理依赖模块。 - 本案例以e1000为例,实际操作时可替换为其他网卡驱动模块名(如
igb、ixgbe等),命令流程完全一致。