交叉编译环境下的Linux内核配置与移植实战 - 第1节

1.1 交叉编译:为什么需要它?

嵌入式系统资源有限(CPU 主频低、内存小、存储空间小),无法直接运行本地编译器(如 gcc)来完成 Linux 内核这样的大型工程编译。因此,必须在性能强大的 宿主机(Host) 上编译出能在 目标机(Target) 上运行的二进制代码,这就是交叉编译。

核心定义: 交叉编译是在一种架构(如 x86_64)上生成另一种架构(如 ARM64、RISC-V)可执行代码的编译过程。

内核移植的意义在于:让 Linux 内核适配特定硬件平台(SoC、外设、内存布局),充分发挥硬件性能,并支持目标产品所需的驱动和文件系统。

1.1.1 宿主机 vs 目标机

角色 典型硬件 操作系统 主要任务
宿主机(Host) x86_64 PC / 服务器 Ubuntu 22.04 LTS 安装交叉工具链、配置内核、编译内核与设备树
目标机(Target) ARM Cortex-A72 / RISC-V 开发板 Linux 内核(待移植) 运行编译好的内核镜像、验证功能
交叉编译环境工作流 宿主机 (x86_64) Ubuntu + 交叉工具链 目标机 (ARM64) 开发板 + 裸机/uboot 编译产物 Image / dtb / modules 关键点:宿主机编译出的二进制文件无法在 x86 上运行,必须下载到目标板才能执行。

1.2 实验环境全景

本课程实验环境由三部分组成:Ubuntu 虚拟机(宿主机)、交叉编译工具链、ARM64 开发板(目标机)。三者通过串口/网络连接,形成完整的开发闭环。

1.2.1 环境组件清单

组件 版本/型号 用途
Ubuntu 虚拟机 22.04 LTS (x86_64) 安装工具链、内核源码、编译环境
交叉工具链 gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu 编译 ARM64 内核与设备树
Linux 内核源码 6.1 LTS (长期支持版) 配置、编译、移植对象
开发板 Raspberry Pi 4B / QEMU virt (ARM64) 运行编译后的内核镜像
启动介质 SD 卡 / TFTP + NFS 引导内核启动
选型建议: 如果手头没有实体开发板,可以使用 QEMU 模拟 ARM64 virt 平台完成全部实验,效果与真实板卡一致。

1.3 搭建 Ubuntu 虚拟机

推荐使用 VMware Workstation 或 VirtualBox 创建虚拟机。最低配置要求:

  • CPU: 2 核以上(推荐 4 核)
  • 内存: 4 GB 以上(推荐 8 GB)
  • 磁盘: 60 GB 以上(推荐 120 GB)
  • 网络: NAT 或桥接模式,确保能访问外网

1.3.1 安装必要软件包

进入 Ubuntu 后,首先更新软件源并安装内核编译所需的依赖:

sudo apt update
sudo apt upgrade -y
sudo apt install -y build-essential flex bison libncurses-dev \
    libssl-dev libelf-dev device-tree-compiler bc \
    u-boot-tools qemu-system-arm qemu-utils
常见错误: 缺少 libssl-dev 会导致编译时出现 "Cannot use CONFIG_CC_STACKPROTECTOR_STRONG" 错误;缺少 flex/bison 会导致设备树编译失败。请务必完整安装上述依赖。

1.4 安装交叉编译工具链

从 ARM 官方(developer.arm.com)下载预编译的 AArch64 交叉工具链,或使用 Linaro 提供的版本。本课程统一使用 ARM 官方 gcc-arm-10.3-2021.07。

1.4.1 下载与解压

cd ~
wget https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz
tar -xf gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz
sudo mv gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu /opt/

1.4.2 配置环境变量

将工具链路径加入 ~/.bashrc,使其永久生效:

echo 'export PATH=$PATH:/opt/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin' >> ~/.bashrc
source ~/.bashrc

1.4.3 验证工具链

aarch64-none-linux-gnu-gcc --version
# 输出示例:
# aarch64-none-linux-gnu-gcc (GNU Toolchain for the A-profile architecture 10.3-2021.07) 10.3.1 20210621
交叉工具链安装验证流程 下载 .tar.xz 解压到 /opt 配置 PATH 验证版本 验证命令:aarch64-none-linux-gnu-gcc --version 如果显示版本号,说明工具链安装成功;否则检查 PATH 是否包含 /opt/.../bin ✅ 工具链就绪

1.5 开发板硬件环境准备

本课程以 Raspberry Pi 4B 作为主要目标板,同时提供 QEMU 模拟方案作为备选。以下为硬件连接与启动准备步骤。

1.5.1 硬件连接清单

  • 电源: 5V/3A USB-C 适配器
  • 串口调试: USB 转 TTL 模块(3.3V 电平),连接 GPIO 14/15(UART0)
  • 网络: 以太网线,用于 NFS/TFTP 下载内核
  • 存储: 16 GB 以上 microSD 卡(用于存放 bootloader、内核、设备树)

1.5.2 烧录引导固件

Raspberry Pi 4B 需要专用的 bootloader 固件(bootcode.bin、start4.elf、fixup4.dat)以及设备树文件。从官方 GitHub 仓库 raspberrypi/firmware 获取:

git clone --depth=1 https://github.com/raspberrypi/firmware
# 将 firmware/boot/ 下的所有文件复制到 SD 卡第一个分区(FAT32)
QEMU 用户: 无需 SD 卡和串口线。直接使用以下命令启动模拟环境:
qemu-system-aarch64 -M virt -cpu cortex-a72 -smp 4 -m 2G -kernel Image -append "console=ttyAMA0" -nographic

1.6 环境验证:编译最小内核

在正式开始课程前,先进行一次完整的“最小编译”测试,确保工具链、源码、环境配置全部正确。

1.6.1 获取内核源码

cd ~
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.1.76.tar.xz
tar -xf linux-6.1.76.tar.xz
cd linux-6.1.76

1.6.2 配置与编译

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

编译完成后,在 arch/arm64/boot/ 目录下生成 Image 文件,大小约 30~40 MB。

最小内核编译流程 下载源码 defconfig make Image 生成 arch/arm64/boot/Image 编译命令中 ARCH=arm64 指定目标架构,CROSS_COMPILE 指定交叉工具链前缀,缺一不可。 ✅ 环境验证通过,可进入下一章

1.7 本章小结

  • 理解了交叉编译的必要性:宿主机 x86_64 编译,目标机 ARM64 运行。
  • 搭建了 Ubuntu 虚拟机并安装内核编译依赖。
  • 安装并验证了 AArch64 交叉编译工具链。
  • 准备了 Raspberry Pi 4B 硬件环境(或 QEMU 模拟环境)。
  • 通过最小内核编译验证了整个工具链与源码环境的正确性。
下一步: 从第 2 章开始,我们将深入内核源码目录结构,学习如何根据具体硬件平台进行内核配置裁剪。