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
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 文件。
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 # 顶层配置菜单
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 可用空间。