交叉编译环境下的Linux内核配置与移植实战 - 第1节
1.1 交叉编译:为什么需要它?
嵌入式系统资源有限(CPU 主频低、内存小、存储空间小),无法直接运行本地编译器(如 gcc)来完成 Linux 内核这样的大型工程编译。因此,必须在性能强大的 宿主机(Host) 上编译出能在 目标机(Target) 上运行的二进制代码,这就是交叉编译。
内核移植的意义在于:让 Linux 内核适配特定硬件平台(SoC、外设、内存布局),充分发挥硬件性能,并支持目标产品所需的驱动和文件系统。
1.1.1 宿主机 vs 目标机
| 角色 | 典型硬件 | 操作系统 | 主要任务 |
|---|---|---|---|
| 宿主机(Host) | x86_64 PC / 服务器 | Ubuntu 22.04 LTS | 安装交叉工具链、配置内核、编译内核与设备树 |
| 目标机(Target) | ARM Cortex-A72 / RISC-V 开发板 | Linux 内核(待移植) | 运行编译好的内核镜像、验证功能 |
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 | 引导内核启动 |
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
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
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-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。
1.7 本章小结
- 理解了交叉编译的必要性:宿主机 x86_64 编译,目标机 ARM64 运行。
- 搭建了 Ubuntu 虚拟机并安装内核编译依赖。
- 安装并验证了 AArch64 交叉编译工具链。
- 准备了 Raspberry Pi 4B 硬件环境(或 QEMU 模拟环境)。
- 通过最小内核编译验证了整个工具链与源码环境的正确性。