简单内核模块编写

可查看内核源代码中的说明:linux-src/Documentation/kbuild/modules.txt

模块编写

hellomod.c:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>

MODULE_LICENSE("Dual BSD/GPL");

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

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

module_init(hellomod_init);
module_exit(hellomod_exit);
  • 所有模块必须包含 module.h

  • kernel.h 包含了常用的内核函数

  • init.h 包含了宏 __init__exit 宏,它们允许释放内核占用的内存

  • printf() 函数由内核定义,功能和 printf() 类似,它把信息输出到终端或系统日志

  • module_init(), 这是驱动程序初始化的入口点。 对于内置模块,内核在引导时调用该入口点; 对于可加载模块则在该模块插入内核时才调用

  • module_exit, 对于可加载模块,内核在此处调用 module_cleanup() 函数, 而对于内置的模块,它什么都不做

模块编译与运行

编写 Makefile 文件如下:

MODNAME = hellomod

obj-m := $(MODNAME).o

KDIR := /lib/modules/`uname -r`/build
MDIR := /lib/modules/`uname -r`/extra

# 编译模块
all:
	make -C $(KDIR) M=$(PWD) modules

# 安装模块
install:
	cp $(MODNAME).ko $(MDIR)
	depmod -a

# 卸载模块
uninstall:
	rm $(MDIR)/$(MODNAME).ko

# 清理文件
clean:
	make -C $(KDIR) M=$(PWD) clean
  1. 编译模块

    make
    
  2. 安装模块

    sudo make install
    
  3. 载入模块

    sudo modprobe hellomod
    
  4. 查看打印的 "Hello, World!\n"

    dmesg
    
  5. 移除模块

    sudo rmmod hellomod
    

    或者

    sudo modprobe -r hellomod
    
  6. 查看打印的 "Goodbye, World!\n"

    dmesg
    
  7. 卸载模块

    sudo make uninstall
    
  8. 清理文件

    make clean