3. 使用ioctl控制虚拟设备
任务说明
本案例目标是通过 modinfo 和 depmod 两个命令,查看网卡驱动模块的依赖关系及参数信息。我们将以 Linux 内核自带的 e1000 网卡驱动模块为例,完成以下操作:
- 使用
modinfo查看e1000模块的详细信息(包括依赖、参数、作者、描述等); - 使用
depmod生成模块依赖关系文件,并通过modprobe --show-depends查看e1000的实际依赖链; - 验证模块参数是否可被读取,并确认依赖关系文件已正确生成。
环境准备
本案例需要一台装有 Linux 系统(内核版本 2.6+)且已安装 e1000 网卡驱动模块的主机。绝大多数发行版默认包含该模块。执行以下命令确认模块存在:
ls /lib/modules/$(uname -r)/kernel/drivers/net/ethernet/intel/e1000/e1000.ko*
若输出文件路径,则模块可用。若未找到,可先执行 modprobe e1000 加载,或安装对应内核模块包(如 linux-modules-extra-$(uname -r))。
实现步骤
1. 使用 modinfo 查看模块信息
modinfo 直接读取模块文件中的元数据,无需加载模块即可显示信息。执行:
modinfo e1000
关键输出字段说明:
- filename:模块文件路径;
- license:许可证类型;
- description:模块功能描述;
- depends:该模块直接依赖的其他模块(逗号分隔);
- parm:模块可接受的加载参数及其类型和默认值。
对于 e1000,典型输出中 depends 为空(表示无强制依赖),parm 包含 TxDescriptors、RxDescriptors、Speed、Duplex、AutoNeg、FlowControl 等参数。
2. 使用 depmod 生成依赖关系
depmod 扫描内核模块目录,生成 modules.dep 文件(含依赖关系)及 modules.symbols、modules.alias 等辅助文件。执行:
sudo depmod -a
该命令会为当前内核版本($(uname -r))更新 /lib/modules/$(uname -r)/modules.dep。若只想处理指定内核目录,可加 -b 参数指定根路径。
3. 查看实际依赖链
生成依赖文件后,使用 modprobe --show-depends 查看 e1000 的完整依赖链(包括间接依赖):
modprobe --show-depends e1000
该命令输出类似:
insmod /lib/modules/5.15.0-91-generic/kernel/drivers/net/ethernet/intel/e1000/e1000.ko
若 e1000 依赖其他模块(如 crc32c),则会在 insmod e1000 之前先列出对应模块的 insmod 行。
4. 验证模块参数可读
加载模块后,可通过 sysfs 查看当前参数值:
sudo modprobe e1000
ls /sys/module/e1000/parameters/
cat /sys/module/e1000/parameters/TxDescriptors
若输出数值(默认通常为 256),说明参数已生效且可读。
SVG:模块依赖与参数查看流程
验证方法与判定标准
完成上述步骤后,按以下标准确认任务成功:
- modinfo 输出完整:执行
modinfo e1000能显示 filename、license、description、depends、parm 等字段,且 parm 字段至少包含 3 个以上参数定义; - 依赖文件已生成:执行
ls -l /lib/modules/$(uname -r)/modules.dep,文件存在且大小非零; - 依赖链可解析:
modprobe --show-depends e1000能输出至少一行以insmod开头的完整路径,且路径指向的 .ko 文件真实存在; - 参数可读:加载模块后,
cat /sys/module/e1000/parameters/TxDescriptors能输出一个整数值(默认 256),无错误提示。
以上四项全部满足,即判定本案例验证通过。若 depmod 因权限不足失败,请使用 sudo 重新执行;若 modinfo 提示模块不存在,请先确认内核模块包已正确安装。