1. 嵌入式linux驱动-模块操作命令

2019-07-12 14:29发布

文章目录

1. 常用模块操作命令

  • lsmod (list module,将模块列表显示),功能是打印出当前内核中已经安装的模块列表。
  • insmod(install module,安装模块),功能是向当前内核中去安装一个模块,用法是insmod xxx.ko。
  • modinfo(module information,模块信息),功能是打印出一个内核模块的自带信息。,用法是modinfo xxx.ko,注意要加.ko,也就是说是一个静态的文件形式。
  • rmmod(remove module,卸载模块),功能是从当前内核中卸载一个已经安装了的模块,用法是rmmod xxx.ko ,rmmod xxx都可以。
  • 其他如modprobe、depmod等

2. 模块的安装

  • insmod与module_init宏。模块源代码中用module_init宏声明了一个函数(在我们这个例子里是chrdev_init函数),作用就是指定chrdev_init这个函数和insmod命令绑定起来,也就是说当我们insmod
    module_test.ko时,insmod命令内部实际执行的操作就是帮我们调用chrdev_init函数。
  • 模块安装时insmod内部除了帮我们调用module_init宏所声明的函数外,实际还做了一些别的事(譬如lsmod能看到多了一个模块也是insmod帮我们在内部做了记录,也就是将我们的模块加入到内核的一个数据结构中去),但是我们就不用管了。

3. 模块的卸载

  • rmmod和module_exit宏。当我们执行rmmod命令的时候,就会执行模块的module_exit宏声明的函数,同样也会将我们这个模块信息从我们内核的模块管理的数据结构中将其删除。

4. 模块的版本信息

  • 使用modinfo查看模块的版本信息,内核zImage中也有一个确定的版本信息。insmod时模块的vermagic必须和内核的相同,否则不能安装,报错信息为:insmod: ERROR: could not insert module module_test.ko: Invalid module format。
  • 模块的版本信息是为了保证模块和内核的兼容性,是一种安全措施。如何保证模块的vermagic和内核的vermagic一致?编译模块的内核源码树就是我们编译正在运行的这个内核的那个内核源码树即可。说白了就是模块和内核要同出一门。

5. 模块中常用宏

  • MODULE_LICENSE(“GPL”),模块的许可证。一般声明为GPL许可证,而且最好不要少,否则可能会出现莫名其妙的错误,譬如一些明显存在的函数提升找不到。
  • MODULE_AUTHOR(“xxx”),用来添加模块的作者信息。
  • MODULE_DESCRIPTION(“xxx”),用来添加模块的描述信息。
  • MODULE_ALIAS(“xxxx”),用来添加模块的别名。
  • 以上的这些东西,我们通过modinfo命令查看模块的时候是可以看到的。