编写一个简单的内核模块

从一个简单的“Hello, World!”内核模块开始,了解模块编程的基础。

示例

#include <linux/module.h>  // Needed by all modules
#include <linux/kernel.h>  // Needed for KERN_INFO
#include <linux/init.h>    // Needed for macros

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

static void __exit hello_exit(void)
{
    printk(KERN_INFO "Goodbye, World!\n");
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple Hello World module");

编译与加载模块

  1. 在目录中编写Makefile:
    obj-m += hello_module.o
    
    all:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
    
    clean:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
    

注意:之后其他章节均有类似此示例的Makefile,故省略不写,Makefile中obj-m变量的值应与模块名一致。

  1. 编译模块:

    make
    
  2. 加载模块:

    sudo insmod hello_module.ko
    
  3. 查看模块加载日志:

    dmesg | tail
    
  4. 卸载模块:

    sudo rmmod hello_module