在树莓派上编译linux内核模块

模块源码就用最简单的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

猜你喜欢

转载自blog.csdn.net/u011031257/article/details/80841957