Linux kernel中module相关命令集

本文深入解析Linux内核模块管理的四个关键命令:lsmod用于列出已加载模块;insmod用于加载模块;rmmod用于卸载模块;modprobe则能自动处理模块的依赖关系,实现更智能的模块加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    Linux的kernel能够以动态的方式加载,卸载模块,以达到减小内核的大小,复杂度,以及增加内核的灵活性。目前,我知道的有lsmod,insmod,rmmod,modprobe四条命令,现在分别总结记录这四条命令,命令后的模块名称均不加后缀(如.ko或.o)。

1:lsmod 即list modules的简称
功能说明:显示已载入系统的所有模块。
语法:lsmod   模块名称
说明:执行lsmod指令,会列出所有已载入系统的模块。Linux操作系统的核心具有模块化的特性,因此在编译核心时,无需把全部的功能都放入核心。你可以将这些功能编译成一个个单独的模块,待需要时再分别载入

一般显示的格式如下:

nfs      170109  0 -          Live 0x129b0000
lockd    51593   1 nfs,       Live 0x128b0000
nls_utf8 1729    0 -          Live 0x12830000
vfat     12097   0 -          Live 0x12823000
fat      38881   1 vfat,      Live 0x1287b000
第一列表示:模块的名字

第二列表示:用到的内存大小,单位为byte

第三列表示:列出当前引用了该模块的实例数,0表示这是没有实例引用该模块

第四列表示:列出它所依赖的模块如果有的话

第五列表示:模块加载的状态,取值只能是Live,Loading或Unloading中的一个

第六列表示:加载的模块在内核中内存地址偏移量,这个信息可用于调试的目的


2:insmod 即insert module的简称
功能说明:载入模块。
语法:insmod [-fkmpsvxX][-o <模块名称>][模块文件][符号名称 = 符号值]
说明:Linux有许多功能是通过模块的方式,在需要时才载入kernel。如此可使kernel较为精简,进而提高效率,以及保有较大的弹性。这类可载入的模块,通常是设备驱动程序。
参数-f  不检查目前kernel版本与模块编译时的kernel版本是否一致,强制将模块载入。 
-k  将模块设置为自动卸除。 
-m  输出模块的载入信息。 
-o<模块名称>  指定模块的名称,可使用模块文件的文件名。 
-p  测试模块是否能正确地载入kernel。 
-s  将所有信息记录在系统记录文件中。 
-v  执行时显示详细的信息。 
-x  不要汇出模块的外部符号。 
-X  汇出模块所有的外部符号,此为预设值。


3:rmmod 即remove module的简称
功能说明:删除模块。
语法:rmmod [-as][模块名称...]
说明:执行rmmod指令,可删除不需要的模块。Linux操作系统的核心具有模块化的特性,因此在编译核心时,不需把全部的功能都放入核心。你可以将这些功能编译成一个个单独的模块,待有需要时再分别载入它们。
参数:
-a  删除所有目前不需要的模块。 
-s  把信息输出至syslog常驻服务,而非终端机界面。


4:modprobe 即module probe的简称

功能说明:自动处理可载入模块。
语法:modprobe [-acdlrtvV][--help][模块文件][符号名称 = 符号值]。
说明:modprobe可载入指定的个别模块,或是载入一组相依的模块。modprobe会根据depmod所产生的相依关系,决定要载入哪些模块。若在载入过程中发生错误,在modprobe会卸载整组的模块。

参数
-a或--all  载入全部的模块。 
-c或--show-conf  显示所有模块的设置信息。 
-d或--debug  使用排错模式。 
-l或--list  显示可用的模块。 
-r或--remove  模块闲置不用时,即自动卸载模块。 
-t或--type  指定模块类型。 
-v或--verbose  执行时显示详细的信息。 
-V或--version  显示版本信息。 
-help  显示帮助。


insmod 与 modprobe 都是载入 kernel module,不过一般差别于 modprobe 能够处理 module 载入的相依问题。比方你要载入 a module,但是 a module 要求系统先载入 b module 时,直接用 insmod 挂入通常都会出现错误讯息,不过 modprobe 倒是能够知道先载入 b module 后才载入 a module,如此相依性就会满足。
不过 modprobe 并不是大神,不会厉害到知道 module 之间的相依性为何,该程式是读取 /lib/modules/2.6.xx/modules.dep 档案得知相依性的。而该档案是透过 depmod 程式所建立。(PS:今天遇到想卸载一个module,用rmmod总是失败,后来用modprobe -r就成功卸载了,不知道是不是因为依耐性的问题)。

在 Buildroot 中,`eval` 命令的作用是在构建过程中动态执行一个字符串作为 Shell 命令。`kernel-module` 是 Buildroot 中用于构建 Linux 内核模块的选项之一。因此,`eval kernel-module` 的作用是动态执行一个字符串以构建 Linux 内核模块。 具体用法如下: 1. 在 Buildroot 的 `make` 命令中添加 `BR2_PACKAGE_CUSTOM_KERNEL_MODULES=y`,启用自定义内核模块选项。 2. 在 `package/Config.in` 文件中添加以下代码,定义内核模块选项: ``` config BR2_PACKAGE_MY_KERNEL_MODULE bool "My Kernel Module" help Build and install my custom kernel module ``` 3. 在 `package/my_kernel_module/` 目录下创建以下文件: - `my_kernel_module.mk`:定义内核模块的构建规则。 - `my_kernel_module.modprobe`: 定义内核模块的 modprobe 配置文件。 4. 在 `my_kernel_module.mk` 中,使用以下代码定义内核模块的构建规则: ``` MY_KERNEL_MODULE_VERSION = 1.0 MY_KERNEL_MODULE_SITE = $(TOPDIR)/../my_kernel_module MY_KERNEL_MODULE_SITE_METHOD = local define MY_KERNEL_MODULE_BUILD_CMDS $(MAKE) -C $(@D) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(TARGET_CROSS) \ KERNELDIR=$(LINUX_DIR) M=$(PWD) modules endef define MY_KERNEL_MODULE_INSTALL_TARGET_CMDS $(INSTALL) -D -m 644 $(@D)/my_kernel_module.ko \ $(TARGET_DIR)/lib/modules/$(KERNEL_VERSION)/extra/my_kernel_module.ko endef $(eval $(kernel-module)) ``` 这里,`MY_KERNEL_MODULE_VERSION` 指定内核模块的版本号,`MY_KERNEL_MODULE_SITE` 指定内核模块的源代码目录,`MY_KERNEL_MODULE_SITE_METHOD` 指定内核模块的源代码获取方式(这里是本地目录),`MY_KERNEL_MODULE_BUILD_CMDS` 定义内核模块的构建命令,`MY_KERNEL_MODULE_INSTALL_TARGET_CMDS` 定义将内核模块安装到目标系统的命令。 5. 在 `my_kernel_module.modprobe` 文件中定义内核模块的 modprobe 配置信息: ``` alias my_kernel_module my_kernel_module.ko ``` 6. 最后,在 Buildroot 的菜单配置界面中,选择 `Target packages -> Hardware handling -> Kernel modules -> My Kernel Module`,使 Buildroot 构建系统包含您的自定义内核模块。 在 Buildroot 构建系统构建完成后,您的自定义内核模块将被编译并安装到目标系统中,可以使用 modprobe 命令加载和卸载该模块。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值