SBC-sig/documents/raspberrypi/交叉编译内核.md

163 lines
5.6 KiB
Markdown
Raw Normal View History

<!-- 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)