树莓派超全系列教程文档--(45)如何交叉编译树莓派内核


文章来源: http://raspberry.dns8844.cn/documentation

原文网址

构建内核

操作系统预装的默认编译器和链接器被配置为构建在该操作系统上运行的可执行文件。 原生编译 使用这些默认编译器和链接器。交叉编译 是为运行编译过程的目标之外的目标编译代码的过程。

Raspberry Pi 内核的交叉编译允许你从 32 位操作系统构建 64 位内核,反之亦然。或者,你也可以从 Raspberry Pi 以外的设备交叉编译 32 位或 64 位 Raspberry Pi 内核。

交叉编译内核

首先,你需要一台合适的 Linux 交叉编译主机。我们倾向于使用 Ubuntu;因为 Raspberry Pi OS 也是 Debian 发行版,所以编译命令也类似。

安装所需的依赖项和工具链

要构建用于交叉编译的源代码,请在设备上安装所需的依赖项。运行以下命令安装大部分依赖项:

$ sudo apt install bc bison flex libssl-dev make libc6-dev libncurses5-dev

然后,针对要构建的内核架构安装适当的工具链:

  • 要安装 64 位工具链以构建 64 位内核,请运行以下命令:
$ sudo apt install crossbuild-essential-arm64
  • 要安装 32 位工具链以构建 32 位内核,请运行以下命令:
$ sudo apt install crossbuild-essential-armhf
构建配置

本节介绍如何在构建内核时应用默认配置。您还可以通过以下方式配置内核:

输入以下命令以创建源文件和设备树文件:

[cols=“8,<.^20a,60a”]
|===
| Target Architecture | Target Model | Command

.10+.| 64-bit
| Raspberry Pi 3
.9+.^| [source,console]

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

| Raspberry Pi Compute Module 3
| Raspberry Pi 3+
| Raspberry Pi Compute Module 3+
| Raspberry Pi Zero 2 W
| Raspberry Pi 4
| Raspberry Pi 400
| Raspberry Pi Compute Module 4
| Raspberry Pi Compute Module 4S

.^| Raspberry Pi 5
.1+.^|

$ cd linux
$ KERNEL=kernel_2712
$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2712_defconfig

.14+.| 32-bit

| Raspberry Pi 1
.4+.^| [source,console]

$ cd linux
$ KERNEL=kernel
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcmrpi_defconfig

| Raspberry Pi Compute Module 1
| Raspberry Pi Zero
| Raspberry Pi Zero W

| Raspberry Pi 2
.6+.^|

$ cd linux
$ KERNEL=kernel7
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig

| Raspberry Pi 3
| Raspberry Pi Compute Module 3
| Raspberry Pi 3+
| Raspberry Pi Compute Module 3+
| Raspberry Pi Zero 2 W

| Raspberry Pi 4
.4+.^|

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

| Raspberry Pi 400
| Raspberry Pi Compute Module 4
| Raspberry Pi Compute Module 4S
|===

使用 LOCALVERSION 自定义内核版本

为防止内核覆盖 /lib/modules 中的现有模块,并在 uname 输出中表明运行的是自己的内核,请调整 LOCALVERSION 内容。

要修改 LOCALVERSION,请修改 .config 中的此行:

CONFIG_LOCALVERSION="-v7l-MY_CUSTOM_KERNEL"

TIP: 你也可以在 General setup > Local version - append to kernel release 中使用 menuconfig 以图形方式更改这一设置。有关 menuconfig 的更多信息,请参阅 内核配置说明

Build
  • 运行以下命令构建 64 位内核:
$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs
  • 运行以下命令构建 32 位内核:
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs
安装内核

创建内核后,您需要将其复制到 Raspberry Pi 启动介质(可能是 SD 卡或 SSD)上,然后安装模块。

查找启动介质

首先,运行 lsblk。然后,连接启动媒体。再次运行 lsblk;新设备代表启动介质。你应该会看到类似下面的输出:

sdb
   sdb1
   sdb2

如果 sdb 代表启动介质,则 sdb1 代表 FAT32 格式的 启动分区,而 sdb2 代表(可能是 ext4 格式的)根分区

首先,将这些分区挂载为 mnt/bootmnt/root,调整分区代号以匹配启动介质的位置:

$ mkdir mnt
$ mkdir mnt/boot
$ mkdir mnt/root
$ sudo mount /dev/sdb1 mnt/boot
$ sudo mount /dev/sdb2 mnt/root
安装

接下来,将内核模块安装到启动介质上:

  • 对于 64 位内核:
$ sudo env PATH=$PATH make -j12 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=mnt/root modules_install
  • 对于 32 位内核:
$ sudo env PATH=$PATH make -j12 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/root modules_install

TIP: 在多核设备上 make -j<n> 选项可在各核之间分配工作。这会大大加快编译速度。运行 nproc 查看你有多少个处理器;我们建议使用处理器数量的 1.5 倍。

接下来,将内核和设备树 blob 安装到启动分区,并备份原始内核。

安装 64 位内核:

  • 运行以下命令创建当前内核的备份镜像,安装新的内核镜像、overlays、README,并卸载分区:
$ sudo cp mnt/boot/$KERNEL.img mnt/boot/$KERNEL-backup.img
$ sudo cp arch/arm64/boot/Image mnt/boot/$KERNEL.img
$ sudo cp arch/arm64/boot/dts/broadcom/*.dtb mnt/boot/
$ sudo cp arch/arm64/boot/dts/overlays/*.dtb* mnt/boot/overlays/
$ sudo cp arch/arm64/boot/dts/overlays/README mnt/boot/overlays/
$ sudo umount mnt/boot
$ sudo umount mnt/root

安装 32 位内核:

. 运行以下命令创建当前内核的备份镜像,并安装新的内核镜像:

$ sudo cp mnt/boot/$KERNEL.img mnt/boot/$KERNEL-backup.img
$ sudo cp arch/arm/boot/zImage mnt/boot/$KERNEL.img

. 根据你的 内核版本,运行以下命令安装设备树 blobs:
** 适用于 6.4 及以下版本的内核:

$ sudo cp arch/arm/boot/dts/*.dtb mnt/boot/

** 适用于 6.5 及以上版本的内核:
+

$ sudo cp arch/arm/boot/dts/broadcom/*.dtb mnt/boot/

. 最后,安装overlays和 README,并卸载分区:

$ sudo cp arch/arm/boot/dts/overlays/*.dtb* mnt/boot/overlays/
$ sudo cp arch/arm/boot/dts/overlays/README mnt/boot/overlays/
$ sudo umount mnt/boot
$ sudo umount mnt/root

最后,将启动媒体连接到 Raspberry Pi,并接通电源,运行新编译的内核。

或者,用不同的文件名复制内核(如 kernel-myconfig.img),而不是覆盖 kernel.img 文件。然后,编辑启动分区中的 config.txt 以选择内核:

kernel=kernel-myconfig.img

将此方法与自定义的 LOCALVERSION 相结合,可将自定义内核与系统管理的原版内核映像分开。有了这种方法,当你的内核无法启动时,你就可以迅速恢复到原版内核。

上一篇 – 树莓派超全系列教程文档–(44)如何在树莓派上编译树莓派内核
下一篇 – 树莓派超全系列教程文档–(46)如何配置内核功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值