1.什么是 Linux 内核模块?
内核模块是可以根据需要加载到内核中或从内核中卸载的代码块,因此无需重启就可以扩展内核的功能。事实上,除非用户使用类似lsmod这样的命令来查询模块信息,否则用户不太可能知道内核发生的任何变化。多数情况下,模块会根据需要加载的,而且用户不需要知道它们如何运作。
(以上内容参考:https://mp.weixin.qq.com/s/s3VSDEUD_gcQ0dF-Yk7Pqw)
2.与内核模块相关的命令
(1)depmod:
Linux depmod命令用于分析可载入模块的相依性。
depmod(depend module)可检测模块的相依性,生成 modules.dep
和映射文件,供modprobe在安装模块时使用。
语法:
depmod [-adeisvV][-m <文件>][--help][模块名称]
参数说明:
- -a或--all 分析所有可用的模块。
- -d或debug 执行排错模式。
- -e 输出无法参照的符号。
- -i 不检查符号表的版本。
- -m<文件>或system-map<文件> 使用指定的符号表文件。
- -s或--system-log 在系统记录中记录错误。
- -v或--verbose 执行时显示详细的信息。
- -V或--version 显示版本信息。
- --help 显示帮助。
用法如下:
在输入depmod -a 命令后,红框目录下会生成橙色框所示的modules.dep文件,查看这个文件可以到各个模块的依赖关系,蓝框里的内容表示冒号前面的模块依赖冒号后面的模块。
(2)insmod
Linux insmod(install module)命令用于载入模块。
Linux有许多功能是通过模块的方式,在需要时才载入kernel。如此可使kernel较为精简,进而提高效率,以及保有较大的弹性。这类可载入的模块,通常是设备驱动程序。
语法:
insmod [-fkmpsvxX][-o <模块名称>][模块文件][符号名称 = 符号值]
参数说明:
- -f 不检查目前kernel版本与模块编译时的kernel版本是否一致,强制将模块载入。
- -k 将模块设置为自动卸除。
- -m 输出模块的载入信息。
- -o<模块名称> 指定模块的名称,可使用模块文件的文件名。
- -p 测试模块是否能正确地载入kernel。
- -s 将所有信息记录在系统记录文件中。
- -v 执行时显示详细的信息。
- -x 不要汇出模块的外部符号。
- -X 汇出模块所有的外部符号,此为预设置。
用法如下:
输入命令 sudo insmod /lib/modules/`uname -r`/kernal/drivers/ata/pata_amd.ko,其中`uname -r`显示内核模块版本号。
加载成功以后可以看到如下情况:
使用insmod加载模块时要注意当模块依赖于另一个模块时,要确保那个模块已被加载,否则会有错误提示,可以去modules.dep文件里面查找。
(推荐使用modprobe命令,此命令会自动加载被依赖的模块,也不需要输入路径信息)
(3)lsmod
Linux lsmod命令用于显示已载入系统的模块。
执行lsmod(list modules)指令,会列出所有已载入系统的模块。Linux操作系统的核心具有模块化的特性,应此在编译核心时,务须把全部的功能都放入核心。您可以将这些功能编译成一个个单独的模块,待需要时再分别载入。
语法:
lsmod
lsmod命令是显示内核模块最方便的命令。然而,也有其他方式可以显示它们。lsmod列出的是/proc目录下的modules
。
用法如下:
(4)modinfo
Linux modinfo命令用于显示kernel模块的信息。
modinfo会显示kernel模块的对象文件,以显示该模块的相关信息。
语法:
modinfo [-adhpV][模块文件]
参数:
- -a或--author 显示模块开发人员。
- -d或--description 显示模块的说明。
- -h或--help 显示modinfo的参数使用方法。
- -p或--parameters 显示模块所支持的参数。
- -V或--version 显示版本信息。
用法如下:
(5)modprobe
Linux modprobe命令用于自动处理可载入模块。
modprobe可载入指定的个别模块,或是载入一组相依的模块。modprobe会根据depmod所产生的相依关系,决定要载入哪些模块。若在载入过程中发生错误,在modprobe会卸载整组的模块。
语法:
modprobe [-acdlrtvV][--help][模块文件][符号名称 = 符号值]
参数:
- -a或--all 载入全部的模块。
- -c或--show-conf 显示所有模块的设置信息。
- -d或--debug 使用排错模式。
- -l或--list 显示可用的模块。
- -r或--remove 模块闲置不用时,即自动卸载模块。
- -t或--type 指定模块类型。
- -v或--verbose 执行时显示详细的信息。
- -V或--version 显示版本信息。
- -help 显示帮助。
用法如下:
(6)rmmod
Linux rmmod命令用于删除模块。
执行rmmod指令,可删除不需要的模块。Linux操作系统的核心具有模块化的特性,应此在编译核心时,务须把全部的功能都放如核心。你可以将这些功能编译成一个个单独的模块,待有需要时再分别载入它们。
语法:
rmmod [-as][模块名称...]
参数:
- -a 删除所有目前不需要的模块。
- -s 把信息输出至syslog常驻服务,而非终端机界面。
用法如下:
rmmod只能移除目前没有被用到的模块。
更详细的内容可以参考:https://www.cnblogs.com/jacklikedogs/p/4659249.html