2. 开发环境搭建:Linux主机环境配置、交叉编译工具链安装、源码获取与版本管理

嵌入式Linux内核开发的第一步是搭建一个稳定、可复现的宿主开发环境。本章将指导你完成从主机系统配置、交叉编译工具链安装到内核源码获取与版本管理的完整流程,为后续的设备树移植与SPI驱动适配打下坚实基础。

环境概览:本课程推荐使用 Ubuntu 22.04 LTS 作为宿主操作系统,搭配 GCC 13.2.0 交叉编译工具链,内核源码版本为 Linux 6.6 LTS。所有操作均在 x86_64 主机上完成,目标平台为 ARM64(Cortex-A72)。

2.1 Linux主机环境配置

一个干净的Linux开发环境需要安装必要的系统工具、编译依赖和版本管理软件。以下步骤适用于Debian/Ubuntu系发行版。

2.1.1 基础系统依赖安装

sudo apt update
sudo apt install -y \
    build-essential \
    flex bison \
    libncurses-dev \
    libssl-dev \
    libelf-dev \
    bc \
    cpio \
    rsync \
    git \
    wget \
    curl \
    file \
    tree \
    vim \
    u-boot-tools \
    device-tree-compiler
软件包 用途说明 版本要求
build-essential GCC/G++ 编译器及 make 工具链 ≥ 12.0
flex bison 词法/语法分析器,用于内核配置解析 ≥ 2.6
libncurses-dev menuconfig 图形配置界面支持 ≥ 6.3
libssl-dev 内核模块签名与加密支持 ≥ 3.0
libelf-dev ELF 文件解析,内核模块编译必需 ≥ 0.189
device-tree-compiler 设备树源文件(.dts)编译工具 ≥ 1.7
版本兼容性提示:如果主机 GCC 版本低于 12.0,编译 Linux 6.6 内核时可能遇到 __attribute__((error)) 等新语法不支持的错误。建议使用 gcc --version 确认版本,必要时通过 apt install gcc-12 g++-12 安装较新版本。

2.1.2 开发环境验证

安装完成后,执行以下命令验证关键工具是否就绪:

gcc --version
make --version
dtc --version
git --version
python3 --version

预期输出示例:

gcc (Ubuntu 13.2.0-4ubuntu3) 13.2.0
GNU Make 4.3
dtc 1.7.0
git version 2.43.0
Python 3.12.3
开发环境依赖关系图 Ubuntu 22.04 LTS 主机 build-essential flex / bison libncurses-dev libssl / libelf Git 版本管理 DTC 设备树编译 交叉编译工具链 内核编译 + 设备树生成

2.2 交叉编译工具链安装

交叉编译是指在 x86_64 主机上编译生成 ARM64 架构可执行代码的过程。对于嵌入式 Linux 内核开发,交叉编译工具链是必备组件。

2.2.1 工具链选择

工具链类型 适用场景 安装方式 前缀
Linaro GCC ARM Cortex-A 系列通用开发 apt 或 预编译包 aarch64-linux-gnu-
ARM GCC (官方) 裸机或 RTOS 开发 ARM 官网下载 aarch64-none-elf-
Buildroot 工具链 定制化根文件系统 + 内核 Buildroot 构建 自定义
Yocto SDK 企业级嵌入式 Linux 发行版 Yocto 构建 自定义
推荐选择:本课程使用 Linaro GCC 13.2.0,通过 apt 直接安装,与 Ubuntu 22.04 集成度最高,兼容 Linux 6.6 内核编译。

2.2.2 安装 Linaro 交叉编译工具链

# 方法一:通过 apt 安装(推荐)
sudo apt install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

# 方法二:下载预编译包(备用)
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
sudo tar -xvf gcc-linaro-*.tar.xz -C /opt/
export PATH=$PATH:/opt/gcc-linaro-*/bin

2.2.3 验证工具链

aarch64-linux-gnu-gcc --version
aarch64-linux-gnu-gcc -v 2>&1 | grep "Target:"

预期输出:

aarch64-linux-gnu-gcc (Linaro GCC 13.2.0) 13.2.0
Target: aarch64-linux-gnu
测试交叉编译:编写一个简单的 C 程序 hello.c,使用 aarch64-linux-gnu-gcc -o hello hello.c 编译,然后通过 file hello 确认生成的是 ARM64 ELF 文件。
交叉编译流程示意图 x86_64 主机 Ubuntu 22.04 交叉编译工具链 aarch64-linux-gnu-gcc ARM64 目标板 Cortex-A72 编译产物 vmlinux(ELF)→ Image(压缩)→ zImage/Image.gz 设备树 .dtb 文件、内核模块 .ko 文件

2.3 源码获取与版本管理

Linux 内核源码采用 Git 进行版本管理,官方仓库托管于 kernel.org。正确的源码获取与版本管理策略直接影响后续移植工作的效率。

2.3.1 内核源码获取方式

方式 命令/链接 适用场景 大小
Git 克隆完整仓库 git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 长期开发、需要完整历史 ~4.5 GB
Git 浅克隆(shallow) git clone --depth=1 --branch v6.6 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 快速获取特定版本 ~2.0 GB
下载 tar 压缩包 wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.tar.xz 一次性编译、无需版本管理 ~200 MB(压缩)
推荐方式:本课程使用 Git 浅克隆 获取 Linux 6.6 LTS 版本,兼顾下载速度与版本管理灵活性。后续设备树移植和 SPI 驱动适配均在此版本上进行。

2.3.2 获取 Linux 6.6 LTS 源码

# 创建开发目录
mkdir -p ~/linux_dev && cd ~/linux_dev

# 浅克隆 Linux 6.6 稳定版
git clone --depth=1 --branch v6.6 \
    https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git \
    linux-6.6

cd linux-6.6

# 查看版本信息
make kernelversion
# 输出: 6.6.0

2.3.3 版本管理最佳实践

在设备树移植和驱动开发过程中,建议采用以下分支管理策略:

  • 主分支(main):保持与上游 v6.6 标签一致,不直接修改。
  • 开发分支(dev-dts):用于设备树文件修改与调试。
  • 驱动分支(dev-spi):用于 SPI 驱动代码开发。
  • 补丁分支(patches):存放格式化补丁文件,便于回溯与分享。
# 创建开发分支
git checkout -b dev-dts v6.6
git checkout -b dev-spi v6.6

# 查看分支
git branch -a

# 生成补丁(示例)
git format-patch v6.6 --stdout > my_dts_changes.patch
重要提醒:不要在 v6.6 标签上直接提交修改。始终基于标签创建新分支,这样可以在需要时快速回退到干净的官方源码状态。

2.3.4 源码目录结构速览

理解内核源码的目录布局有助于快速定位设备树和 SPI 驱动相关文件:

linux-6.6/
├── arch/                # 体系结构相关代码
│   └── arm64/           # ARM64 平台代码
│       ├── boot/        # 启动相关(含设备树)
│       │   └── dts/     # 设备树源文件
│       └── configs/     # 默认内核配置文件
├── drivers/             # 设备驱动
│   └── spi/             # SPI 子系统驱动
├── include/             # 内核头文件
│   ├── linux/spi/       # SPI 子系统头文件
│   └── dt-bindings/     # 设备树绑定头文件
├── scripts/             # 编译与配置脚本
│   └── dtc/             # 设备树编译器源码
├── Makefile             # 顶层 Makefile
└── Kconfig              # 顶层配置菜单
Linux 6.6 源码关键目录结构 linux-6.6/ arch/arm64/ drivers/spi/ include/linux/ scripts/dtc/ boot/dts/ spi-*.c 驱动文件 spi/ 头文件 dtc 编译器源码 设备树文件位于 arch/arm64/boot/dts/,SPI 驱动位于 drivers/spi/

2.4 环境验证与测试编译

完成上述步骤后,执行一次最小化编译以验证整个开发环境是否正常工作。

# 配置 ARM64 默认配置
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig

# 编译内核(仅编译内核镜像,不编译模块)
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc) Image

# 编译设备树
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc) dtbs

编译成功后,检查生成的文件:

ls -lh arch/arm64/boot/Image
ls -lh arch/arm64/boot/dts/
验证结果:如果 arch/arm64/boot/Image 文件存在且大小在 30-50 MB 之间,说明交叉编译环境配置正确。设备树文件(.dtb)应出现在对应的厂商目录下。

2.5 常见问题与排错

错误现象 可能原因 解决方案
gcc: command not found build-essential 未安装 sudo apt install build-essential
aarch64-linux-gnu-gcc: not found 交叉工具链未安装或 PATH 未设置 安装 gcc-aarch64-linux-gnu 或手动添加 PATH
flex: command not found flex/bison 缺失 sudo apt install flex bison
fatal: not a git repository 未在源码目录内执行 Git 命令 cd linux-6.6 后再操作
*** Unable to determine the host compiler 主机 GCC 版本过低 升级 GCC 到 12.0 以上
磁盘空间提醒:完整的内核编译过程(含模块)可能需要 20-30 GB 磁盘空间。建议确保 ~/linux_dev 所在分区至少有 50 GB 可用空间。