3. 配置内核编译环境

任务说明

本案例面向Android SoC BSP开发中的内核编译环境搭建环节。目标是从SoC厂商获取内核源码,配置正确的交叉编译工具链,并完成内核镜像的编译。以高通MSM8916平台为例,内核源码版本为3.10,使用AArch32(32位ARM)交叉工具链。

环境准备

宿主机要求:Ubuntu 18.04/20.04 x86_64,已安装git、make、gcc、libncurses5-dev等基础包。Android NDK r14b或独立工具链均可,本案例使用Linaro GCC 4.9工具链,路径为/opt/toolchains/gcc-arm-linux-gnueabihf-4.9。

关键完整代码

#!/bin/bash
# build_kernel.sh - MSM8916内核编译脚本
set -e

# ---------- 1. 配置变量 ----------
KERNEL_SRC="$HOME/msm8916-kernel"
TOOLCHAIN_PREFIX="/opt/toolchains/gcc-arm-linux-gnueabihf-4.9/bin/arm-linux-gnueabihf-"
JOBS=$(nproc)

# ---------- 2. 获取内核源码 ----------
if [ ! -d "$KERNEL_SRC" ]; then
    git clone --depth 1 -b msm8916 \
        https://github.com/LineageOS/android_kernel_wingtech_wt88047.git \
        "$KERNEL_SRC"
fi
cd "$KERNEL_SRC"

# ---------- 3. 设置交叉编译环境 ----------
export ARCH=arm
export CROSS_COMPILE="$TOOLCHAIN_PREFIX"
export PATH="/opt/toolchains/gcc-arm-linux-gnueabihf-4.9/bin:$PATH"

# 验证工具链
if ! command -v ${CROSS_COMPILE}gcc > /dev/null; then
    echo "错误: 未找到交叉编译器 ${CROSS_COMPILE}gcc"
    exit 1
fi
${CROSS_COMPILE}gcc --version | head -1

# ---------- 4. 清理并生成默认配置 ----------
make distclean
# 使用厂商预置defconfig(若存在)
if [ -f "arch/arm/configs/msm8916_defconfig" ]; then
    make msm8916_defconfig
else
    # 回退:使用高通基准配置
    make msm8916-perf_defconfig
fi

# ---------- 5. 编译内核 ----------
make -j"$JOBS" zImage

# ---------- 6. 输出检查 ----------
if [ -f "arch/arm/boot/zImage" ]; then
    echo "编译成功: arch/arm/boot/zImage"
    ls -lh arch/arm/boot/zImage
else
    echo "编译失败: zImage未生成"
    exit 1
fi

运行方式

  1. 安装工具链:将Linaro GCC 4.9解压至/opt/toolchains/,确认arm-linux-gnueabihf-gcc可执行。
  2. 赋予脚本执行权限并运行:chmod +x build_kernel.sh && ./build_kernel.sh
  3. 首次运行会自动克隆源码(约1GB),后续运行直接复用本地目录。

验证方法

  • 工具链验证:脚本第3步会打印交叉编译器版本,应显示gcc version 4.9.x。
  • 编译产物:最终在arch/arm/boot/下生成zImage文件,大小约5~8MB。
  • 通过条件:脚本退出码为0,且输出“编译成功: arch/arm/boot/zImage”即判定通过。

常见问题

  • 头文件缺失:若报elf.h或ncurses.h缺失,执行sudo apt install libelf-dev libncurses5-dev。
  • 工具链不匹配:若编译中段报unknown type name 'u64'等类型错误,说明CROSS_COMPILE未生效,检查脚本中export语句是否被覆盖。
  • defconfig不存在:部分厂商分支使用不同命名,可先执行make help查看可用配置列表,选择对应目标。
内核编译环境配置流程 1. 获取源码 git clone -b msm8916 2. 配置工具链 export ARCH=arm CROSS_COMPILE=... 3. 内核配置 make distclean make msm8916_defconfig 4. 编译内核 make -j$(nproc) zImage 5. 验证产物 arch/arm/boot/zImage 关键检查点 ✓ 工具链版本: arm-linux-gnueabihf-gcc 4.9 ✓ defconfig存在性检查 ✓ 编译错误定位: 查看输出日志尾部 ✓ 产物大小: 5~8MB (zImage) ✓ 退出码为0表示成功 注: 若defconfig缺失, 使用make help 查看可用配置目标