Linux Module

Module基础知识

Posted by Wingin Cheung on May 23, 2019

Linux Module基础知识

1、概述

​ 模块(module)是一种向Linux内核添加设备驱动程序、文件系统及其他组件的有效方法,而无需连编新内核或重启系统,模块消除了宏内核的许多限制,模块有许多优点:

  • 通过使用模块,内核发布者能够预先编译大量驱动程序,但并不会造成内核镜像发生膨胀,在自动检测硬件(例如USB)或用户提示之后,安装例程选择适当的模块并将其添加到内核中;
  • 内核开发者可以将试验性的代码打包到模块中,模块可以卸载、修改代码或重新打包后可以重新加载,这使得可以快速测试新特性,无需每次都重启系统

  模块几乎可以无缝地插入到内核,模块代码导出一些函数,可以由其他核心模块(包括持久编译到内核中的代码)使用。同样,在模块代码需要卸载时,模块和内核剩余部分之间的关联,也会相应终止。

2、module相关命令

2.1 module装载

​ module可通过insmod动态装载到运行中的内核中:

insmod <module>.ko

  或者使用modprobe指令动态装载:

modprobe <module>.ko

  Tips:insmod不能自动解决module依赖关系,而modprobe可自动添加依赖的module

2.2 module卸载

​ module可通过rmmod从运行的内核中卸载:

rmmod <module>.ko

​ 或者使用modprobe指令卸载:

modprobe -r <module>.ko

Tips:rmmod不能自动解决module依赖关系,而modprobe可自动处理module的依赖关系

2.3 查看已加载的module

​ 在终端Terminal中输入以下指令:

lsmod

​ 或者cat相关文件查看:

cat /proc/modules

2.4 查看module详细信息

​ 在终端Terminal中输入以下指令:

modinfo <module>.ko

3、module编写及使用

​ 话不多说,按照惯例,我们先用module向世界say hello先~

​ 首先,我们先建个名为module_hello.c的文件,其中内容如下:

#include <linux/kernel.h>

#include <linux/module.h>


int init_module( void )
{
    printk(KERN_INFO "Hello, World!\n");
    return 0;
}

void cleanup_module( void )
{
    printk(KERN_INFO "Good Bye, World\n");
}

MODULE_LICENSE( "GPL" );
MODULE_AUTHOR( "Wingin Cheung" );
MODULE_DESCRIPTION( "say hello in a module." );

​ 然后我们再建个名为Makefile的文件,其内容为:

obj-m += module_hello.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/buile M=$(PWD) clean

​ 接着我们在终端Terminal中输入编译指令:

$ make

​ 当编译完成后,我们可以在当前目录下,看到一个名为module_hello.ko的文件。

​ 让我们输入装载module指令见证”奇迹”吧:

$ sudo insmod module_hello.ko

​ 什么?什么都没看到?经典的”Hello, World!”呢?????!!!!!

​ 肯定是你操作姿势不对,快翻+10086个筋斗~

​ 嗯?筋斗翻完了?非常好,让我们看看它去哪里了,来,让系统告诉我们吧:

$ dmesg

​ 系统”说”了,你看到了么:

...
[263479.055856] Hello, World!    

​ 还不信?那就让系统再告诉我们module_hello.ko是否真的在运行吧:

$ lsmod | grep module_hello

​ 系统给你回馈了吧?

module_hello            16384    0

​ “偷窥”完了吧,那我们卸载了它先,让它消失、让系统清净会儿:

$ rmmod module_hello.ko

​ 同样,请先翻+10086个筋斗,然后再让系统告诉我们module_hello.ko退出去了:

[263749.031647] Good Bye, World

​ 好了,装/卸载模块我们都试过了,让我们”窥探”一下折腾了我们一会儿的module_hello.ko具体的信息:

$ modinfo module_hello.ko
filename:        /home/wingin/module_hello/module_hello.ko
desrcription:    say hello in a module.
author:          Wingin Cheung
license:         GPL
srcversion:      C1CBAE74E7A6E03AC313841
depends:
retpoline:       Y
name:            module_hello
vermagic:        4.15.0-50-generic SMP mod_unload

  什么都看完了,module会玩了吧?那跪安吧,哈哈~