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  显示帮助。

用法如下:

ModemManager内核 内核模块命令_加载

在输入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`显示内核模块版本号。

ModemManager内核 内核模块命令_内核模块_02

加载成功以后可以看到如下情况:

ModemManager内核 内核模块命令_内核模块_03

使用insmod加载模块时要注意当模块依赖于另一个模块时,要确保那个模块已被加载,否则会有错误提示,可以去modules.dep文件里面查找。

(推荐使用modprobe命令,此命令会自动加载被依赖的模块,也不需要输入路径信息)

(3)lsmod

Linux lsmod命令用于显示已载入系统的模块。

执行lsmod(list modules)指令,会列出所有已载入系统的模块。Linux操作系统的核心具有模块化的特性,应此在编译核心时,务须把全部的功能都放入核心。您可以将这些功能编译成一个个单独的模块,待需要时再分别载入。

语法:

lsmod

lsmod命令是显示内核模块最方便的命令。然而,也有其他方式可以显示它们。lsmod列出的是/proc目录下的modules

用法如下:

ModemManager内核 内核模块命令_内核模块_04

(4)modinfo

Linux modinfo命令用于显示kernel模块的信息。

modinfo会显示kernel模块的对象文件,以显示该模块的相关信息。

语法:

modinfo [-adhpV][模块文件]

参数

  • -a或--author  显示模块开发人员。
  • -d或--description  显示模块的说明。
  • -h或--help  显示modinfo的参数使用方法。
  • -p或--parameters  显示模块所支持的参数。
  • -V或--version  显示版本信息。

用法如下:

ModemManager内核 内核模块命令_加载_05

(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  显示帮助。

用法如下:

ModemManager内核 内核模块命令_版本信息_06

(6)rmmod

Linux rmmod命令用于删除模块。

执行rmmod指令,可删除不需要的模块。Linux操作系统的核心具有模块化的特性,应此在编译核心时,务须把全部的功能都放如核心。你可以将这些功能编译成一个个单独的模块,待有需要时再分别载入它们。

语法:

rmmod [-as][模块名称...]

参数

  • -a  删除所有目前不需要的模块。
  • -s  把信息输出至syslog常驻服务,而非终端机界面。

用法如下:

ModemManager内核 内核模块命令_内核模块_07

rmmod只能移除目前没有被用到的模块。