模块源码就用最简单的hello_kernel.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
static int hello_kernel_init(void)
{
printk("hello kernel init\n");
return 0;
}
static void hello_kernel_exit(void)
{
printk("hello kernel exit\n");
}
module_init(hello_kernel_init);
module_exit(hello_kernel_exit);
MODULE_LICENSE("GPL");
Makefile
obj-m += hello_kernel.o
KERNEL := /usr/src/linux-headers-4.14.34+/
all:
make -C $(KERNEL) M=$(shell pwd) modules
clean:
make -C $(KERNEL) M=$(shell pwd) clean
install:
insmod hello_kernel.ko
uninstall:
rmmod hello_kernel
这里需要注意的是Makefile中内核源码目录(由make -C 参数指定的目录),如果使用的是树莓派官方镜像,系统中一般是没有完整的linux内核源码的,我们也不用去重新编译安装内核,只需要
sudo apt-get update
sudo apt-get install raspberrypi-kernel-headers
来获得内核源码,安装完成后会在/usr/src/目录下生成目录linux-headers-(version)/目录,该目录内就是我们需要的源码。相应修改Makefile中的KERNEL变量值就可以了,如果源码目录指定有误在编译时多会出现以下错误
No such file or directory
No rule to make target 'modules'
准备工作完成后运行
make #编译
sudo make install #安装内核模块
sudo make uninstall #卸载模块
可以使用
dmesg | grep "hello kernel"
查看printk的输出
[15864.268526] hello kernel init
[15869.533290] hello kernel exit