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 为例)

  1. 下载预编译工具链:从 ARM 官方或 Linaro 获取 gcc-arm-11.3-2022.02-x86_64-arm-linux-gnueabihf.tar.xz。
  2. 解压到指定目录:
sudo mkdir -p /opt/toolchains
sudo tar -xvf gcc-arm-11.3-2022.02-x86_64-arm-linux-gnueabihf.tar.xz \
  -C /opt/toolchains/
  1. 添加环境变量:编辑 ~/.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
  1. 验证安装:
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- 编译器 (GCC) gcc / g++ / cpp 二进制工具 (Binutils) as / ld / objcopy / strip C 库 (glibc) libc.so / crt0.o 输出:vmlinux / uImage / *.ko 前缀 arm-linux-gnueabihf- 标识了目标架构、ABI 和浮点模型
关键理解:交叉编译工具链的前缀 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 命令将内核和设备树从主机下载到目标板内存。

  1. 安装 TFTP 服务端:
sudo apt update
sudo apt install tftpd-hpa
  1. 配置 TFTP 目录:编辑 /etc/default/tftpd-hpa:
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure --create"
  1. 创建目录并设置权限:
sudo mkdir -p /srv/tftp
sudo chmod 777 /srv/tftp
  1. 重启服务并验证:
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 允许目标板将主机的某个目录挂载为根文件系统,实现主机编译、目标板即时运行。

  1. 安装 NFS 服务端:
sudo apt install nfs-kernel-server
  1. 导出目录:编辑 /etc/exports,添加:
/srv/nfs/rootfs *(rw,sync,no_subtree_check,no_root_squash)
  1. 创建根文件系统目录:
sudo mkdir -p /srv/nfs/rootfs
# 将构建好的根文件系统解压到此目录
sudo tar -xvf buildroot-output/images/rootfs.tar -C /srv/nfs/rootfs/
  1. 重启 NFS 服务:
sudo exportfs -a
sudo systemctl restart nfs-kernel-server

2.2.3 TFTP + NFS 协同启动流程

TFTP + NFS 协同启动流程 ① 目标板上电 U-Boot 启动 ② TFTP 下载 zImage + .dtb ③ 启动内核 bootz / bootm ④ 挂载 NFS 内核启动 → 设备树解析 → 驱动初始化 → 挂载 NFS 根文件系统 主机 TFTP 服务 /srv/tftp/ 主机 NFS 服务 /srv/nfs/rootfs/ 内核命令行参数:root=/dev/nfs nfsroot=192.168.1.100:/srv/nfs/rootfs ip=dhcp
网络配置注意事项:主机与目标板必须在同一网段。建议使用静态 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 安装与配置

  1. 安装 Minicom:
sudo apt install minicom
  1. 首次配置:
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 进入终端。

  1. 快速启动(跳过配置菜单):
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 /dev/ttyUSB0 USB USB 转 UART CP2102/CH340 TTL 电平 UART ARM 目标板 UART0 (ttyS0) U-Boot / Kernel 数据流方向:双向 115200 8N1,无流控
调试技巧:如果 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 开发环境已完全搭建成功。