ARM平台内核移植与设备树配置实战指南 - 第2节
2.1 交叉编译工具链安装
嵌入式 Linux 开发与桌面开发最根本的区别在于目标架构不同。开发主机通常是 x86_64 架构,而 ARM 平台目标板为 armv7、armv8 (AArch64) 等架构。因此,必须在主机上安装交叉编译工具链,使主机能够生成目标板可执行的二进制代码。
2.1.1 工具链选择与版本匹配
选择交叉编译工具链时,需关注以下关键参数:
| 参数 | 说明 | 推荐值 |
|---|---|---|
| 目标架构 | ARM 处理器内核版本 | armv7-a / armv8-a (AArch64) |
| 浮点运算 ABI | 软浮点 / 硬浮点 | hard (gnueabihf) |
| C 库类型 | glibc / uclibc / musl | glibc (通用性最强) |
| GCC 版本 | 与内核版本兼容性 | ≥ 10.x (Linux 5.x/6.x) |
| Binutils 版本 | 汇编器/链接器 | ≥ 2.35 |
实战建议:对于 Cortex-A7/A53 平台,推荐使用
arm-linux-gnueabihf- 前缀的 11.3 版本工具链,该版本对 Linux 5.10 LTS 内核支持良好,且已内置 LTO 和 PIE 支持。
2.1.2 安装步骤(以 Ubuntu 22.04 为例)
- 下载预编译工具链:从 ARM 官方或 Linaro 获取
gcc-arm-11.3-2022.02-x86_64-arm-linux-gnueabihf.tar.xz。 - 解压到指定目录:
sudo mkdir -p /opt/toolchains
sudo tar -xvf gcc-arm-11.3-2022.02-x86_64-arm-linux-gnueabihf.tar.xz \
-C /opt/toolchains/
- 添加环境变量:编辑
~/.bashrc,追加以下内容:
export PATH=$PATH:/opt/toolchains/gcc-arm-11.3-2022.02-x86_64-arm-linux-gnueabihf/bin
export CROSS_COMPILE=arm-linux-gnueabihf-
export ARCH=arm
- 验证安装:
source ~/.bashrc
arm-linux-gnueabihf-gcc --version
arm-linux-gnueabihf-gcc -v 2>&1 | grep 'Target:'
预期输出应包含 Target: arm-linux-gnueabihf,表明交叉编译器已就绪。
2.1.3 交叉编译工具链结构
关键理解:交叉编译工具链的前缀
arm-linux-gnueabihf- 中,arm 表示目标架构,linux 表示操作系统,gnueabihf 表示使用 glibc 库且启用硬浮点。内核编译时通过 CROSS_COMPILE 变量指定该前缀,Makefile 会自动拼接出 gcc、as、ld 等工具的全名。
2.2 TFTP/NFS 服务器配置
在嵌入式开发中,TFTP(Trivial File Transfer Protocol)用于网络加载内核镜像和设备树文件,NFS(Network File System)用于将根文件系统挂载到目标板,实现“无盘启动”和快速迭代。两者结合可大幅缩短开发周期。
2.2.1 TFTP 服务器搭建
TFTP 用于在 U-Boot 阶段通过 tftp 命令将内核和设备树从主机下载到目标板内存。
- 安装 TFTP 服务端:
sudo apt update
sudo apt install tftpd-hpa
- 配置 TFTP 目录:编辑
/etc/default/tftpd-hpa:
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure --create"
- 创建目录并设置权限:
sudo mkdir -p /srv/tftp
sudo chmod 777 /srv/tftp
- 重启服务并验证:
sudo systemctl restart tftpd-hpa
sudo systemctl status tftpd-hpa
验证方法:在
/srv/tftp 下放置一个测试文件 test.txt,然后在目标板 U-Boot 中执行 tftp 0x42000000 test.txt,若成功加载则 TFTP 配置正确。
2.2.2 NFS 服务器搭建
NFS 允许目标板将主机的某个目录挂载为根文件系统,实现主机编译、目标板即时运行。
- 安装 NFS 服务端:
sudo apt install nfs-kernel-server
- 导出目录:编辑
/etc/exports,添加:
/srv/nfs/rootfs *(rw,sync,no_subtree_check,no_root_squash)
- 创建根文件系统目录:
sudo mkdir -p /srv/nfs/rootfs
# 将构建好的根文件系统解压到此目录
sudo tar -xvf buildroot-output/images/rootfs.tar -C /srv/nfs/rootfs/
- 重启 NFS 服务:
sudo exportfs -a
sudo systemctl restart nfs-kernel-server
2.2.3 TFTP + NFS 协同启动流程
网络配置注意事项:主机与目标板必须在同一网段。建议使用静态 IP(如主机 192.168.1.100,目标板 192.168.1.50),并在 U-Boot 中设置
serverip 和 ipaddr 环境变量。防火墙需放行 TFTP(UDP 69)和 NFS(TCP 2049 + rpcbind)端口。
2.3 串口终端与 Minicom 使用
串口是嵌入式开发中最基础、最可靠的调试通道。U-Boot 启动信息、内核早期打印(earlycon)、控制台交互均通过串口完成。Minicom 是 Linux 下最常用的串口终端工具。
2.3.1 硬件连接与参数确认
ARM 开发板通常通过板载 UART 转 USB 芯片(如 CP2102、CH340、FT232)与主机连接。连接前需确认以下参数:
| 参数 | 典型值 | 说明 |
|---|---|---|
| 波特率 | 115200 | U-Boot 和内核默认串口波特率 |
| 数据位 | 8 | 标准 8N1 格式 |
| 停止位 | 1 | — |
| 校验位 | 无 (N) | — |
| 流控制 | 无 | 硬件/软件流控制均关闭 |
2.3.2 Minicom 安装与配置
- 安装 Minicom:
sudo apt install minicom
- 首次配置:
sudo minicom -s
进入配置菜单后,选择 Serial port setup,按以下设置:
A - Serial Device : /dev/ttyUSB0
B - Lockfile Location : /var/lock
E - Bps/Par/Bits : 115200 8N1
F - Hardware Flow Ctrl : No
G - Software Flow Ctrl : No
选择 Save setup as dfl 保存为默认配置,然后选择 Exit 进入终端。
- 快速启动(跳过配置菜单):
minicom -D /dev/ttyUSB0 -b 115200
2.3.3 串口调试常用操作
- 退出 Minicom:
Ctrl+A然后X,选择Yes。 - 打开/关闭回显:
Ctrl+A然后E。 - 发送文件:
Ctrl+A然后S,选择协议(推荐 zmodem)。 - 捕获日志:
Ctrl+A然后L,指定日志文件路径。 - 清屏:
Ctrl+A然后C。
2.3.4 串口终端连接拓扑
调试技巧:如果 Minicom 无输出,首先检查
ls -l /dev/ttyUSB* 确认设备节点存在,然后使用 sudo chmod 666 /dev/ttyUSB0 临时赋予权限,或将自己加入 dialout 组:sudo usermod -aG dialout $USER。重新登录后生效。
2.4 开发环境验证清单
完成上述配置后,建议按以下清单逐项验证,确保环境就绪:
| 序号 | 验证项 | 验证方法 | 预期结果 |
|---|---|---|---|
| 1 | 交叉编译器 | arm-linux-gnueabihf-gcc -v |
显示版本和 Target: arm-linux-gnueabihf |
| 2 | TFTP 服务 | 目标板 U-Boot 执行 tftp 0x42000000 zImage |
文件下载成功,显示传输速率 |
| 3 | NFS 服务 | 目标板内核启动后挂载 NFS | 根文件系统正常挂载,可读写 |
| 4 | 串口通信 | Minicom 连接后按回车 | U-Boot 提示符 => 出现 |
| 5 | 网络连通性 | 目标板 ping 主机 IP | ping 通,无丢包 |
环境就绪标志:当你能在 Minicom 中看到 U-Boot 启动信息,通过 TFTP 下载内核镜像,并最终看到内核挂载 NFS 根文件系统后弹出
login: 提示符时,说明嵌入式 Linux 开发环境已完全搭建成功。