树莓派交叉编译openEuler内核
树莓派交叉编译openEuler内核
1.什么是交叉编译?
通常我们在用Linux编译一个内核的时候,用这个内核来替换自己原有系统的内核,具体过程看我的上一篇文章:CentOS 7 下编译Linux内核,这个过程也称为本地编译,即在原有x86架构的内核上进行新内核的编译和安装,替换等一系列操作,而新内核也是x86架构的。那么想要在arm架构下的运行编译好的x86架构怎么办,直接将两种不同架构的内核拿来用肯定是不行的,这时候就有了交叉编译。
交叉编译是在一种平台(x86)上编译,编译出来的程序,是放到别的平台(arm)上运行即编译的环境,和运行的环境不一样。
2.为什么要交叉编译
编译出来的程序,所要运行的目标环境中,各种资源,都相对有限,所以很难进行直接的本地编译。
具体到我的实验中,想用一个openEuler在树莓派的板子上运行,就出现了openeuler的内核大多是基于x86架构的,而树莓派是arrch64架构的,属于ARM,这时就要用到交叉编译。
3.交叉编译的过程
具体过程参照openEuler官方教程树莓派内核交叉编译,这里再梳理一遍。
安装依赖软件包
apt-get install build-essential bison flex make libc6-dev libncurses5-dev gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu bc libssl-dev -y
下载交叉编译工具(x86_64 编译 arm64)
下载链接:https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
我们使用 Linaro 出品的交叉编译器, Linaro 是一间非营利性质的开放源代码软件工程公司, Linaro 开发了很多软件。最著名的就是 Linaro GCC 编译工具链(编译器),
关于 Linaro 详细的介绍可以到 Linaro 官网查阅。官网地址:https://www.linaro.org
下载内核源码
openEuler 22.03 LTS:(因为是在码云,不会出现下载不了的情况)
git clone git@gitee.com:openeuler/raspberrypi-kernel.git -b openEuler-22.03-LTS && cd raspberrypi-kernel
解压操作
操作目录:$ {WORKDIR},一般放在/usr/src,则可以用/usr/src替换
解压,将交叉编译工具解压到 ~/gcc-linaro
tar xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar
mv ./gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu ~/gcc-linaro
把交叉编译工具添加到环境变量
vim ~/.bashrc
# 将下面这三句添加到.bashrc中
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
export PATH=$PATH:~/gcc-linaro/bin
# 刷新环境变量
source ~/.bashrc
载入默认配置和自定义设置
# 载入默认配置:
make bcm2711_defconfig
# 可以自定义设置(不想设置可以exit)
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig
对应的 defconfig 文件在 ./arch/arm64/configs 下。
编译过程
# 耐心等一会儿~
make -j9
建编译内核模块目录
mkdir ${WORKDIR}/ouput
编译内核模块
make INSTALL_MOD_PATH=${WORKDIR}/output/ modules_install
此时在 ${WORKDIR}/output 文件夹下会生成 lib 文件夹
收集编译结果
# 内核
cp ${WORKDIR}/raspberrypi-kernel/arch/arm64/boot/Image ${WORKDIR}/output/
# 设备树文件等
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}和 ${root},将上面编译好的内核放置到SD卡对应分区。
# 将内核模块放进root
cp -r ${WORKDIR}/output/lib/modules ${root}/lib/
# 将内核放进引导boot
cp ${WORKDIR}/output/Image ${boot}/kernel8.img
# 将设备树文件放进引导boot
cp ${WORKDIR}/output/*.dtb ${boot}/
cp ${WORKDIR}/output/overlays/* ${boot}/overlays/
之后,参考 树莓派使用 使用该 SD 卡启用树莓派,验证功能:可以看到我之前使用的openeuler是20.03版本的,这次替换成了22.03版本的。
.com/openeuler/raspberrypi/blob/master/documents/树莓派使用.md) 使用该 SD 卡启用树莓派,验证功能:可以看到我之前使用的openeuler是20.03版本的,这次替换成了22.03版本的。

更多推荐


所有评论(0)