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 交叉编译流程全景图
下图展示了从主机开发环境到目标板内核镜像的完整编译流程:
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验证了交叉编译环境的正确性