SBC-sig/documents/raspberrypi/交叉编译内核.md
2024-11-18 15:36:35 +08:00

163 lines
5.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!-- TOC -->
- [介绍](#介绍)
- [实验环境](#实验环境)
- [安装依赖软件](#安装依赖软件)
- [编译](#编译)
- [下载内核源码](#下载内核源码)
- [进入内核源码](#进入内核源码)
- [切换分支](#切换分支)
- [设置环境变量](#设置环境变量)
- [载入默认配置](#载入默认配置)
- [编译内核](#编译内核)
- [创建编译内核模块目录](#创建编译内核模块目录)
- [编译内核模块](#编译内核模块)
- [收集编译结果](#收集编译结果)
- [验证内核可用性](#验证内核可用性)
- [将内核模块放进rootfs](#将内核模块放进rootfs)
- [将内核放进引导](#将内核放进引导)
- [将设备树文件放进引导](#将设备树文件放进引导)
<!-- /TOC -->
# 介绍
>![](../public_sys-resources/icon-note.gif) **说明:**
>如需根据自身需求定制内核,可参考本文档。
目前 openEuler 树莓派版本只支持 AArch64 架构。
编译内核时,除了使用 AArch64 架构的运行环境,也可以采用交叉编译的方式。这里,我们以 ubuntu16.04 x86_64 的服务器上编译内核为例,介绍交叉编译的过程。
# 实验环境
- 操作系统ubuntu16.04
- 架构x86_64
# 安装依赖软件
`apt-get install build-essential gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu bc libssl-dev -y`
# 编译
操作目录:${WORKDIR}
## 下载内核源码
根据内核不同版本,需要下载不同仓库的不同分支:
1. 6.6 内核
- openEuler 24.09`git clone git@gitee.com:openeuler/raspberrypi-kernel.git -b OLK-6.6 && cd raspberrypi-kernel`
- openEuler 24.03 LTS`git clone git@gitee.com:openeuler/raspberrypi-kernel.git -b OLK-6.6 && cd raspberrypi-kernel`
2. 6.1 内核
- openEuler 23.03`git clone git@gitee.com:openeuler/raspberrypi-kernel.git -b openEuler-23.03 && cd raspberrypi-kernel`
3. 5.10 内核
- openEuler 22.03 LTS SP4`git clone git@gitee.com:openeuler/raspberrypi-kernel.git -b OLK-5.10 && cd raspberrypi-kernel`
- openEuler 22.03 LTS SP3`git clone git@gitee.com:openeuler/raspberrypi-kernel.git -b OLK-5.10 && cd raspberrypi-kernel`
- openEuler 22.03 LTS SP2`git clone git@gitee.com:openeuler/raspberrypi-kernel.git -b openEuler-22.03-LTS-SP2 && cd raspberrypi-kernel`
- openEuler 22.03 LTS SP1`git clone git@gitee.com:openeuler/raspberrypi-kernel.git -b openEuler-22.03-LTS-SP1 && cd raspberrypi-kernel`
- openEuler 22.09`git clone git@gitee.com:openeuler/raspberrypi-kernel.git -b openEuler-22.09 && cd raspberrypi-kernel`
- openEuler 22.03 LTS`git clone git@gitee.com:openeuler/raspberrypi-kernel.git -b openEuler-22.03-LTS && cd raspberrypi-kernel`
- openEuler 21.09`git clone git@gitee.com:openeuler/raspberrypi-kernel.git -b openEuler-21.09 && cd raspberrypi-kernel`
- openEuler 21.03`git clone git@gitee.com:openeuler/kernel.git -b openEuler-21.03 && cd kernel`
4. 4.19 内核
- openEuler 20.03 LTS`git clone git@gitee.com:openeuler/raspberrypi-kernel.git -b openEuler-20.03-LTS && cd raspberrypi-kernel`
- openEuler 20.09`git clone git@gitee.com:openeuler/raspberrypi-kernel.git -b openEuler-20.09 && cd raspberrypi-kernel`
## 设置环境变量
`export ARCH=arm64`
`export CROSS_COMPILE=aarch64-linux-gnu-`
## 载入默认配置
根据内核不同版本,需要载入不同的默认配置:
1. 6.6 内核
- openEuler 24.09`make bcm2711_defconfig`
- openEuler 24.03 LTS`make bcm2711_defconfig`
2. 6.1 内核
- openEuler 23.03`make bcm2711_defconfig`
3. 5.10 内核
- openEuler 22.03 LTS SP4`make bcm2711_defconfig`
- openEuler 22.03 LTS SP3`make bcm2711_defconfig`
- openEuler 22.03 LTS SP2`make bcm2711_defconfig`
- openEuler 22.03 LTS SP1`make bcm2711_defconfig`
- openEuler 22.09`make bcm2711_defconfig`
- openEuler 22.03 LTS`make bcm2711_defconfig`
- openEuler 21.09`make bcm2711_defconfig`
- openEuler 21.03`make bcm2711_defconfig`
4. 4.19 内核
- openEuler 20.03 LTS`make openeuler-raspi_defconfig`
- openEuler 20.09`make openeuler-raspi_defconfig`
对应的 defconfig 文件在 ./arch/arm64/configs 下。
## 编译内核
`make -j9`
## 创建编译内核模块目录
`mkdir ${WORKDIR}/output`
## 编译内核模块
`make INSTALL_MOD_PATH=${WORKDIR}/output/ modules_install`
在 ${WORKDIR}/output 文件夹下会生成 lib 文件夹。
## 收集编译结果
1. 内核
`cp ${WORKDIR}/raspberrypi-kernel/arch/arm64/boot/Image ${WORKDIR}/output/`
2. 设备树文件等
`cp ${WORKDIR}/raspberrypi-kernel/arch/arm64/boot/dts/broadcom/*.dtb ${WORKDIR}/output/`
`mkdir ${WORKDIR}/output/overlays`
`cp ${WORKDIR}/raspberrypi-kernel/arch/arm64/boot/dts/overlays/*.dtb* ${WORKDIR}/output/overlays/`
至此,所有内核及内核模块相关内容都在 ${WORKDIR}/output 下了。
# 验证内核可用性
使用一个之前刷好 openEuler 树莓派镜像的 SD 卡,直接插到 Linux 主机上SD 会默认挂载其 boot 分区和 根目录分区。这里其挂载路径分别表示为 ${boot} 和 ${rootfs}将上面编译好的内核放置到SD卡对应分区。
## 将内核模块放进rootfs
`cp -r ${WORKDIR}/output/lib/modules ${rootfs}/lib/`
## 将内核放进引导
`cp ${WORKDIR}/output/Image ${boot}/kernel8.img`
## 将设备树文件放进引导
`cp ${WORKDIR}/output/*.dtb ${boot}/`
`cp ${WORKDIR}/output/overlays/* ${boot}/overlays/`
之后,参考 [树莓派使用](./树莓派使用.md) 使用该 SD 卡启用树莓派,验证功能:
![](images/验证内核.jpg)