写一个比较简单的内核模块(打印出“hello world”),实现内核模块的编译/装载与卸载,代码如下:
hello.c
#include "linux/init.h"
#include "linux/kernel.h"
#include "linux/module.h" //3个头文件包含了内核提供的所有内核模块的头文件
static int __init hello_init(void) {
printk(KERN_ALERT "Hello world!\n");
return 0;
}
static void __exit hello_exit(void) {
printk(KERN_ALERT "Goodbye!\n");
}
module_init(hello_init); //告诉内核当内核模块第一次运行时哪个函数将被执行
module_exit(hello_exit); //内核模块被卸载时被执行的函数
MODULE_LICENSE("GPL"); //开源license
MODULE_DESCRIPTION("hello"); //文件描述
Makefile:
obj -m :=hello.o
#内核源代码位置,这里是标准情况下链接到正在使用的内核
KERNELBUILD :=/lib/modules/$(shell uname -r)/build
default:
#编译连接目标
make -C $(KERNELBUILD) M=$(shell pwd) modules
#以下内容不是必须 ,属于执行和清理部分
echo insmod ./hello.ko to turn it on
clean:
rm -rf *.o *.ko *.mod.c .*.cmd *.markers *.order *.symvers .tmp_versions
执行:
make //生成内核模块 ko文件
sudo insmod ./hello.ko
//装在内核模块dmesg | tail
//查看输出信息
sudo rmmod hello //卸载内核模块
dmesg | tail //查看输出信息