Ubuntu 22.04 (x64)树莓派4B(Raspberry Pi 4B)源代码编译

树莓派上的操作


树莓派使用的系统是通过 Raspberry Pi Imager 安装的 2023-05-03-raspios-bullseye-armhf.img.xz

1.升级到最新版内核保证与下载的内核源码版本一致

$ sudo rpi-update

2.升级完整后重启

$ sudo reboot

3.查看内核版本

$ uname -r

4.把最新版本的内核配置保存到.config中,以备以后编译内核使用

$ sudo modprobe configs

文件被存储到了/proc/config.gz中。

目前最新版本是 6.1.12,当前内核启动默认会切换到 64位内核了,即使安装的是32位系统镜像也是这样。

如果想从32位内核启动,那么需要在 config.txt 中配置 arm_64bit

因此下面的编译都是针对6.1.y这个分支进行的。

Debian/Ubuntu下编译


1.获取内核源代码

$ cd ~

$ mkdir rpi

$ cd rpi

2,以下步骤时间很长,可以在睡觉前执行,并且可能需要重试几次才行。

# core.symlinks=true  软连接处理,否则会出现各种找不到文件的问题

$ git -c core.symlinks=true clone https://github.com/raspberrypi/linux.git rpi-linux

3. 安装编译工具

# 编译 32 位代码
$ sudo apt install crossbuild-essential-armhf

# 如果需要编译 64 位代码
# sudo apt install crossbuild-essential-arm64

4.整个的rpi-linux的文件夹的所有者更改为当前用户,否则存在一定程度的编译问题,特别是代码从其他系统上拷贝过来的情况

$ sudo chown -R `whoami` rpi-linux/

5.配置编译类型

$ cd rpi-linux/

# 检出分支
$ git checkout rpi-6.1.y

# 软连接处理,否则会出现各种找不到文件的问题

$ git config core.symlinks true

$ git reset --hard

$ KERNEL=kernel7l

$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2711_defconfig

# 编译64位
# KERNEL=kernel8
# make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig

6. 开始正式编译内核,最后的数字改成比你的CPU核心数量+1以提交多线程编译效率。

$ make clean

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

# 编译64位
# make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs -j6

7.编译错误修正,如果提示如下错误

arch/arm/boot/dts/overlays/adafruit-st7735r-overlay.dts:13:10: fatal error: dt-bindings/gpio/gpio.h: 没有那个文件或目录
   13 | #include <dt-bindings/gpio/gpio.h>
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
make[2]: *** [scripts/Makefile.lib:428:arch/arm/boot/dts/overlays/adafruit-st7735r.dtbo] 错误 1
make[1]: *** [scripts/Makefile.build:500:arch/arm/boot/dts/overlays] 错误 2
make: *** [Makefile:1478:dtbs] 错误 2

这个现象的原因是 git 在检出代码的时候,没有正确处理软连接,我们只需要重新处理一次即可。如下:

# 软连接处理,否则会出现各种找不到文件的问题
 
$ git config core.symlinks true
 
$ git reset --hard

8.查看生成的内核镜像文件

$ cd rpi-linux/arch/arm/boot

生成的zImage就是我们需要的kernel.img

9.编译modules

$ cd ../..

$ mkdir modules

$ cd rpi-linux

# 32位
$ make modules_install ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=../modules

# 64位
# make modules_install ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=../modules

10.编译实时内核

# 如果需要编译实时内核 rpi-linux 目录

$ wget https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/6.1/patch-6.1.38-rt13-rc1.patch.gz 

$ gunzip patch-6.1.38-rt13-rc1.patch.gz 

$ cat patch-6.1.38-rt13-rc1.patch | patch -p1 
 ............................ 
 Reversed (or previously applied) patch detected! Assume -R? [n] y
 ............................

启用实时内核编译配置

32位

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

$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

64位

$ KERNEL=kernel8
 
$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig

$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig

先加载默认生成的配置:

修改配置:

开始正式编译内核,最后的数字改成比你的CPU核心数量+1以提交多线程编译效率。

$ make clean

# 32位
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j6

# 64位
# make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs -j6
安装编译好的内核

Ubuntu下面,SD卡会自动挂载,默认挂载到了/media/目录下面,如果是使用NOOBS安装的话,系统目录是固定的,执行如下命令拷贝到目标SD卡上面

32位

$ cd rpi-linux

$ mv /media/`whoami`/bootfs/kernel7l.img /media/`whoami`/bootfs/kernel7l_old.img

$ cp arch/arm/boot/zImage /media/`whoami`/bootfs/kernel7l.img

$ cp -r /media/`whoami`/bootfs/overlays /media/`whoami`/bootfs/overlays.old

$ cp arch/arm/boot/dts/*.dtb /media/`whoami`/bootfs/

$ cp arch/arm/boot/dts/overlays/*.dtb* /media/`whoami`/bootfs/overlays/

$ cp arch/arm/boot/dts/overlays/README /media/`whoami`/bootfs/overlays/

$ KERNEL=kernel7l 

$ sudo env PATH=$PATH make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/media/`whoami`/rootfs1 modules_install

确认内核已经生效

$ cat /proc/version 
Linux version 6.1.39-rt13-rc1-v7l+ (xxx@xxx) (arm-linux-gnueabihf-gcc (Ubuntu 11.3.0-1ubuntu1~22.04.1) 11.3.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #9 SMP PREEMPT_RT Tue Jul 25 03:28:07 CST 2023

64位

$ cd rpi-linux

$ mv /media/`whoami`/bootfs/kernel8.img /media/`whoami`/bootfs/kernel8_old.img

$ cp arch/arm64/boot/Image /media/`whoami`/bootfs/kernel8.img

$ cp -r /media/`whoami`/bootfs/overlays /media/`whoami`/bootfs/overlays.old

$ cp arch/arm64/boot/dts/broadcom/*.dtb /media/`whoami`/bootfs/

$ cp arch/arm64/boot/dts/overlays/*.dtb* /media/`whoami`/bootfs/overlays/

$ cp arch/arm64/boot/dts/overlays/README /media/`whoami`/bootfs/overlays/

$ KERNEL=kernel8

$ sudo env PATH=$PATH make ARCH=arm64 CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/media/`whoami`/rootfs1 modules_install

参考链接


发布者

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注