树莓派4编译内核与内核模块

最初只是想试一下交叉编译树莓派4的内核模块,结果

pi@raspberrypi:~/Proj$ sudo insmod hello.ko
insmod: ERROR: could not insert module hello.ko: Invalid module format

该问题是由于内核版本不一致造成的。所以就先看一下树莓派内核升级的问题。

目录

  • 准备工作
    • 在Host机器上安装必要的工具
    • 在Host机器上下载ToolChain
    • 在Host机器上下载源代码
  • 在Host机器上交叉编译
    • 配置内核
    • 编译
  • 安装内核
    • 安装模块
    • 安装image
  • 交叉编译hello_world内核模块
    • 源代码hello.c
    • Makefile
  • 参考资料

准备工作

在Host机器上安装必要的工具

sudo apt install git bc bison flex libssl-dev make

在Host机器上下载ToolChain

从Raspberry的官方Git下载toolchain。

git clone https://github.com/raspberrypi/tools ~/tools

更新PATH环境变量,使系统可以找到toolchain

echo PATH=\$PATH:~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin >> ~/.bashrc
source ~/.bashrc

在Host机器上下载源代码

git clone --depth=1 https://github.com/raspberrypi/linux

在Host机器上交叉编译

配置内核

在内核代码目录运行以下命令

KERNEL=kernel7l
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2711_defconfig

编译

在内核代码目录运行以下命令

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs

安装内核

将SD卡从树莓派中取出,连接到Host机器上。

在我的Ubuntu机器上,SD卡中的两个分区,boot和rootfs会自动mount。

安装模块

sudo env PATH=$PATH make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/media/bryan/rootfs modules_instal

安装image

sudo cp /media/bryan/boot/$KERNEL.img /media/bryan/boot/$KERNEL-backup.img
sudo cp arch/arm/boot/zImage /media/bryan/boot/$KERNEL.img
sudo cp arch/arm/boot/dts/*.dtb /media/bryan/boot
sudo cp arch/arm/boot/dts/overlays/*.dtb* /media/bryan/boot/overlays/
sudo cp arch/arm/boot/dts/overlays/README /media/bryan/boot/overlays/

交叉编译hello_world内核模块

源代码hello.c

#include 
#include 
#include 
 
MODULE_LICENSE("Dual BSD/GPL");
 
static int hello_init(void)
{
     
    printk(KERN_ALERT"Hello, world\n");
    return 0;
}
 
static void hello_exit(void)
{
     
    printk(KERN_ALERT"Goodbye, cruel world\n");
}
 
module_init(hello_init);
module_exit(hello_exit);

Makefile

ifneq ($(KERNELRELEASE),)

obj-m := hello.o

else
	
KDIR := /home/bryan/Desktop/Raspberry/linux

all:
	make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

clean:
	rm -f *.ko *.o *.mod.o *.mod.c *.symvers  modul*

endif

参考资料

https://www.raspberrypi.org/documentation/linux/kernel/building.md

你可能感兴趣的:(树莓派,Linux,Device,Driver)