树莓派4B编译内核模块
在树莓派上实现简单的内核模块的编译和测试
下载源码并编译
- 环境准备
sudo apt install git bc bison flex libssl-dev make
- github下载源码
git clone --depth=1 https://github.com/raspberrypi/linux
这个命令只会下载最新的一个版本,不会有历史记录,建议使用下面的命令下载和系统一样的内核版本。
下载指定版本源码,以5.10为例:
sudo git clone --depth=1 https://github.com/raspberrypi/linux --branch rpi-5.10.y
- 编译
对于树莓派4B 64位,使用以下命令进行配置:
cd linux
KERNEL=kernel8
sudo make bcm2711_defconfig
编译:
sudo make -j4 Image.gz modules dtbs
如果需要更新树莓派内核的话,可以使用以下命令:
sudo make modules_install
sudo cp arch/arm64/boot/dts/broadcom/*.dtb /boot/
sudo cp arch/arm64/boot/dts/overlays/*.dtb* /boot/overlays/
sudo cp arch/arm64/boot/dts/overlays/README /boot/overlays/
sudo cp arch/arm64/boot/Image.gz /boot/$KERNEL.img
这里的更新应该是把启动时的内核镜像、设备树进行更新,同时也把一些模块放置在文件系统里面。
内核模块测试
- 编写内核模块代码hello_kernel和Makefile。
hello_kernel.c
#include <linux/module.h>
static int __init my_init(void)
{
printk(KERN_INFO"Hello kernel!\n");
return 0;
}
static void __exit my_exit(void)
{
printk(KERN_INFO"Good bye!\n");
return ;
}
module_init(my_init);
module_exit(my_exit);
MODULE_LICENSE("GPL");
Makefile如下:
KERNELDIR ?=
PWD :=$(shell pwd)
obj-m := hello_kernel.o
all:
make -C $(KERNELDIR) M=$(PWD) modules
clean:
rm -rf *.o *.ko *.mod.c *.mod *.order *.symvers
- 编译
sudo make KERNELDIR=/usr/src/linux
- 测试
使用dmesg查看内核信息:
错误记录
- insmod: ERROR: could not insert module hello_kernel.ko: Invalid module format
dmesg -c查看日志信息,发现是版本的问题。
查看linux源码和树莓派版本,发现不一致,下载和内核版本一致的源码。