交叉编译内核
介绍
目前 EulixOS 树莓派版本只支持 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}
下载内核源码
git clone git@isrc.iscas.ac.cn:mirrors-private/openeuler/raspberrypi-kernel.git
得到文件 ${WORKDIR}/raspberrypi-kernel。
进入内核源码
cd ${WORKDIR}/raspberrypi-kernel
切换分支
这里适用于树莓派的内核源码的分支有 openEuler-20.03-LTS 和 openEuler-20.09,分别对应不同的内核版本。根据需要选择对应分支,下载源码后默认为 master 分支,如果需要选择 openEuler-20.03-LTS 分支,执行下面的命令:
git checkout -b openEuler-20.03-LTS origin/openEuler-20.03-LTS
设置环境变量
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
载入默认配置
make openeuler-raspi_defconfig
其中 openeuler-raspi_defconfig 在 ../linux/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 下了。
验证内核可用性
使用一个之前刷好 EulixOS 树莓派镜像的 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/
之后,参考 树莓派使用 使用该 SD 卡启用树莓派,验证功能: