3. 搭建内核编译环境:安装交叉编译工具链、配置主机开发环境、下载并解压指定版本的内核源码

嵌入式 Linux 驱动开发与原生 PC 开发最大的区别在于交叉编译。目标板(ARM、RISC-V 等)资源有限,无法直接运行编译器,因此需要在强大的 x86 主机上安装交叉编译工具链,生成目标板可执行的二进制代码。本章将手把手搭建完整的编译环境,为后续编写和编译内核模块做好准备。

环境概览:本课程以 Ubuntu 22.04 LTS 作为主机开发系统,目标架构为 ARM64(aarch64),内核版本选用 Linux 5.10 LTS。所有操作均在此组合下验证通过。

3.1 主机开发环境配置

在安装工具链之前,需要确保主机系统具备基础的编译依赖。执行以下命令安装必备软件包:

sudo apt update
sudo apt install -y build-essential flex bison libncurses-dev \
    libssl-dev libelf-dev bc git rsync kmod cpio
软件包 用途说明
build-essential 包含 gcc、g++、make 等基础编译工具
flex / bison 词法分析器和语法分析器,内核配置/解析依赖
libncurses-dev 提供 menuconfig 图形化配置界面的终端库
libssl-dev 内核模块签名和加密功能所需
libelf-dev ELF 文件处理库,内核构建必需
bc 命令行计算器,内核构建脚本使用
版本兼容性提醒:如果主机是 Ubuntu 20.04 或更早版本,请确保 gcc 版本不低于 9.4,否则可能无法编译较新的内核源码。建议统一使用 22.04 LTS 以避免不必要的兼容问题。

3.2 安装交叉编译工具链

对于 ARM64 目标,我们使用 Linaro 提供的 GNU GCC 交叉编译工具链。推荐通过 apt 直接安装官方维护的版本:

sudo apt install -y gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu

安装完成后,验证工具链是否可用:

aarch64-linux-gnu-gcc --version

输出应类似:

aarch64-linux-gnu-gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

交叉工具链的命名规则为 架构-厂商-操作系统-gcc,其中:

  • aarch64 — ARM 64 位架构
  • linux-gnu — 目标操作系统为 Linux,使用 glibc 库
  • gcc — GNU C 编译器

下表列出了常用目标架构对应的交叉编译器前缀:

目标架构 工具链前缀 示例包名
ARM 32-bit (armv7) arm-linux-gnueabihf- gcc-arm-linux-gnueabihf
ARM 64-bit (aarch64) aarch64-linux-gnu- gcc-aarch64-linux-gnu
RISC-V 64-bit riscv64-linux-gnu- gcc-riscv64-linux-gnu
x86 64-bit (本地) x86_64-linux-gnu- gcc (build-essential)

3.3 下载并解压指定版本的内核源码

本课程统一使用 Linux 5.10 LTS 版本。该版本长期维护,社区支持广泛,适合嵌入式驱动开发学习。下载方式有两种:

方式一:从 kernel.org 下载 tarball

wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.10.230.tar.xz
tar -xf linux-5.10.230.tar.xz
cd linux-5.10.230

方式二:使用 git 克隆(推荐,便于切换分支)

git clone --depth 1 --branch v5.10 https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
cd linux
磁盘空间提示:完整的内核源码解压后约 1.2 GB,编译过程中还会生成大量中间文件,建议预留至少 10 GB 空闲空间。

3.4 交叉编译环境验证

在正式编译内核之前,先通过一个简单的测试验证交叉工具链和源码是否就绪。在源码根目录执行:

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc) Image

如果编译成功,会在 arch/arm64/boot/ 目录下生成 Image 文件:

ls -lh arch/arm64/boot/Image
# 输出示例:-rw-rw-r-- 1 user user 28M Apr  1 10:30 arch/arm64/boot/Image

这表明交叉编译环境已正确搭建,内核源码可以正常编译。

3.5 交叉编译流程全景图

下图展示了从主机开发环境到目标板内核镜像的完整编译流程:

交叉编译环境搭建与内核编译流程 交叉编译环境搭建与内核编译流程 主机 Ubuntu 22.04 安装编译依赖 交叉工具链 下载 Linux 5.10 LTS 内核源码(tarball / git) make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc) Image 输出产物:arch/arm64/boot/Image — 未经压缩的内核镜像,可直接用于 QEMU 或烧录到目标板

3.6 常见问题与避坑指南

  • 工具链版本不匹配:如果编译过程中出现 unknown type name 'u64' 等类型错误,通常是因为交叉编译器版本过旧。建议使用 gcc 10+ 版本。
  • 缺少 ncurses 库:执行 make menuconfig 时报错 Unable to find the ncurses libraries,请确认已安装 libncurses-dev。
  • 权限问题:不要在 /root 或系统保护目录下解压和编译内核,建议在普通用户的家目录下操作。
  • 磁盘空间不足:编译过程中 make modules_install 会占用额外空间,建议使用 make clean 清理临时文件。
快速验证脚本:将以下内容保存为 check_env.sh,一键检查环境是否就绪:
#!/bin/bash
echo "=== 检查交叉编译器 ==="
aarch64-linux-gnu-gcc --version && echo "[OK]" || echo "[FAIL]"
echo "=== 检查内核源码 ==="
ls linux-5.10*/Makefile &>/dev/null && echo "[OK]" || echo "[FAIL]"
echo "=== 检查编译依赖 ==="
dpkg -l | grep -E "build-essential|libncurses-dev|libssl-dev" &>/dev/null && echo "[OK]" || echo "[FAIL]"

3.7 本章小结

至此,我们已经完成了嵌入式 Linux 驱动开发环境的全部搭建工作:

  • 配置了 Ubuntu 主机开发环境,安装了必要的编译依赖
  • 安装了 ARM64 交叉编译工具链并验证了版本
  • 下载并解压了 Linux 5.10 LTS 内核源码
  • 通过编译 Image 验证了交叉编译环境的正确性