Linux内核模块(.ko文件)的自动load涉及多个组件和配置步骤,以下是其原理、方式及配置手段的详细说明:
一、自动load原理
- 模块与硬件的匹配:
• 内核模块通过MODULE_DEVICE_TABLE
宏声明其支持的设备标识符(如USB设备的vendorID:productID
或PCI设备的ID)。
• 这些信息会被编译到模块中,并通过depmod
工具生成到/lib/modules/$(uname -r)/modules.alias
文件中。 - 事件触发机制:
• 当硬件被检测到(如插入USB设备),内核通过sysfs
生成设备节点,并触发udev
事件。
•udev
根据设备属性(如ID)查询modules.alias
,找到匹配的模块名。 - 依赖处理:
•depmod
生成的modules.dep
文件记录模块依赖关系,modprobe
在load模块时会自动解析并load依赖项。
二、自动load方式
- 启动时静态load:
• systemd-modules-load:在系统启动时读取/etc/modules-load.d/*.conf
,load列出的模块。
• initramfs:在早期启动阶段load关键驱动(如磁盘控制器驱动),需通过dracut
或update-initramfs
更新。 - 运行时动态load:
• udev规则:udev
根据设备事件调用modprobe
load模块。默认规则位于/usr/lib/udev/rules.d/80-drivers.rules
。
• 手动触发:通过modprobe <模块名>
手动load。
三、配置手段
- 模块列表配置:
• 在/etc/modules-load.d/
中创建.conf
文件,每行写入需启动时load的模块名。例如:# /etc/modules-load.d/my-driver.conf my_driver
- 模块别名与黑名单:
• 在/etc/modprobe.d/
中创建配置文件,设置别名或将模块加入blacklist:# 将模块加入blacklist blacklist problematic_module # 设置别名 alias pci:v00001234d* my_driver
- udev规则定制:
• 创建自定义规则文件(如/etc/udev/rules.d/99-my-driver.rules
):# 匹配USB设备并load模块 ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="1234", ATTR{idProduct}=="5678", RUN+="/sbin/modprobe my_driver"
- 更新模块数据库:
• 安装新模块后,需运行:sudo depmod -a sudo systemctl restart systemd-udevd