2. 开发环境搭建

嵌入式Linux开发与桌面开发最大的区别在于宿主机-目标机分离模式。开发者需要在性能强劲的x86工作站(宿主机)上编写代码,并使用交叉编译工具链生成ARM/MIPS/RISC-V等架构的可执行文件,再通过TFTP/NFS等网络服务将内核与根文件系统传输到嵌入式板卡(目标机)上运行。本章将系统讲解这一基础环境的搭建方法。

环境概览: 本课程以 Ubuntu 22.04 LTS 作为宿主机操作系统,目标机为 ARM Cortex-A7/A53 开发板。所有工具链与服务器配置均基于此环境,其他发行版可参照调整。
嵌入式交叉开发环境架构 宿主机 (x86 Ubuntu) 交叉编译工具链 TFTP 服务器 NFS 服务器 串口终端 目标机 (ARM 开发板) U-Boot 引导 Linux 内核 根文件系统 调试接口 通信链路:串口(控制台) + 以太网(TFTP/NFS 数据传输) 宿主机编译 → 网络传输 → 目标机加载运行

2.1 交叉编译工具链安装

交叉编译工具链是嵌入式开发的基石。它运行在x86宿主机上,但生成的目标代码却面向ARM、MIPS等不同架构。工具链的核心组件包括:交叉编译器(如 arm-linux-gnueabihf-gcc)、交叉链接器(ld)、交叉汇编器(as)以及C库(glibc/uClibc)。

2.1.1 工具链选择与下载

目前主流的交叉编译工具链来源有三种,开发者可根据项目需求选择:

工具链来源 适用场景 优点 缺点
Linaro GCC ARM Cortex-A系列通用开发 官方维护、更新快、支持ARMv7/ARMv8 仅支持ARM架构
Buildroot / Yocto 定制化根文件系统 + 工具链 高度可定制、与系统集成紧密 构建时间长、学习曲线陡
芯片厂商SDK 特定SoC(如NXP i.MX、TI AM335x) 硬件适配最佳、包含板级支持包 版本固定、更新滞后
推荐选择: 本课程采用 Linaro 提供的 arm-linux-gnueabihf- 工具链,版本 gcc-12.2,glibc 2.36。该工具链兼容性广,适合绝大多数ARM Cortex-A系列开发板。

2.1.2 安装步骤

  1. 下载工具链压缩包(约200MB):
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
  1. 解压到指定目录(建议统一放在 /opt/toolchains 下):
sudo mkdir -p /opt/toolchains
sudo tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz -C /opt/toolchains/
  1. 配置环境变量(编辑 ~/.bashrc 或 /etc/profile):
export PATH=$PATH:/opt/toolchains/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
  1. 使环境变量生效并验证:
source ~/.bashrc
arm-linux-gnueabihf-gcc --version

若输出类似 arm-linux-gnueabihf-gcc (Linaro GCC 7.5-2019.12) 7.5.0 的信息,则安装成功。

常见错误: 如果提示 "No such file or directory",通常是因为宿主机缺少32位库支持。执行 sudo apt install libc6:i386 lib32stdc++6 即可解决。

2.2 TFTP/NFS服务器配置

嵌入式开发中,内核镜像(uImage/zImage)、设备树(.dtb)和根文件系统需要从宿主机传输到目标机。TFTP用于引导阶段(U-Boot加载内核),NFS用于运行阶段(挂载远程根文件系统)。

2.2.1 TFTP服务器

TFTP(Trivial File Transfer Protocol)是一种轻量级文件传输协议,常用于U-Boot引导时下载内核和设备树。配置步骤如下:

  1. 安装TFTP服务器与客户端:
sudo apt update
sudo apt install tftpd-hpa tftp-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 -R 777 /srv/tftp
  1. 重启服务并测试:
sudo systemctl restart tftpd-hpa
echo "test" | sudo tee /srv/tftp/test.txt
tftp localhost -c get test.txt

若当前目录下出现 test.txt 文件,则TFTP服务器正常工作。

TFTP 引导内核流程 U-Boot 启动 TFTP 请求 宿主机响应 加载 U-Boot 环境变量示例: setenv serverip 192.168.1.100; setenv ipaddr 192.168.1.10; tftp 0x80800000 zImage

2.2.2 NFS服务器

NFS(Network File System)允许目标机将宿主机上的某个目录挂载为根文件系统,极大方便了内核调试阶段的文件修改。配置步骤如下:

  1. 安装NFS服务器:
sudo apt install nfs-kernel-server
  1. 创建共享目录并导出根文件系统(假设根文件系统位于 /srv/nfs/rootfs):
sudo mkdir -p /srv/nfs/rootfs
# 将已构建的根文件系统复制到此目录
sudo cp -a /path/to/your/rootfs/* /srv/nfs/rootfs/
  1. 编辑 /etc/exports 添加共享配置:
/srv/nfs/rootfs *(rw,sync,no_subtree_check,no_root_squash)
参数说明: rw 表示读写权限;sync 保证数据同步写入;no_root_squash 允许目标机以root身份访问,避免权限问题。
  1. 重启NFS服务并验证:
sudo exportfs -a
sudo systemctl restart nfs-kernel-server
showmount -e localhost

输出应包含 /srv/nfs/rootfs 条目。

2.3 串口终端与网络调试

串口是嵌入式开发中最可靠的调试通道,用于输出内核启动日志、进入U-Boot命令行以及运行交互式shell。网络调试则用于高效传输数据和远程GDB调试。

2.3.1 串口终端配置

大多数ARM开发板通过USB转串口(如CP2102、CH340、FT232)与宿主机连接。在Linux下,串口设备通常显示为 /dev/ttyUSB0 或 /dev/ttyACM0。

  1. 安装串口终端工具(推荐 minicom 或 screen):
sudo apt install minicom
  1. 配置 minicom:
sudo minicom -s

进入配置菜单后,设置以下参数:

参数项 推荐值 说明
串口设备 /dev/ttyUSB0 根据实际设备节点调整
波特率 115200 大多数开发板默认值
数据位 8 标准设置
停止位 1 标准设置
奇偶校验 无 标准设置
硬件流控 关闭 避免干扰数据
  1. 保存配置并连接:选择 "Save as dfl",然后退出菜单即可进入终端界面。若开发板已上电并连接,应能看到U-Boot启动信息。
权限问题: 如果提示 "Cannot open /dev/ttyUSB0: Permission denied",将当前用户加入 dialout 组:sudo usermod -a -G dialout $USER,然后注销重新登录。

2.3.2 网络调试基础

网络调试主要涉及IP地址配置和连通性测试。宿主机与目标机通常通过直连网线或小型交换机连接,并配置在同一网段。

  1. 宿主机网络配置(设置静态IP):
sudo ip addr add 192.168.1.100/24 dev eth0
sudo ip link set eth0 up
  1. 目标机网络配置(在U-Boot中设置):
setenv ipaddr 192.168.1.10
setenv serverip 192.168.1.100
setenv gatewayip 192.168.1.1
setenv netmask 255.255.255.0
saveenv
  1. 连通性测试:在U-Boot中执行 ping 192.168.1.100,若收到响应,则网络链路正常。
网络调试拓扑 宿主机 IP: 192.168.1.100 TFTP/NFS 服务 交换机 目标机 IP: 192.168.1.10 U-Boot / Linux 串口线(调试控制台):宿主机 /dev/ttyUSB0 ↔ 目标机 UART 网线(数据传输):宿主机 eth0 ↔ 交换机 ↔ 目标机 eth0

2.4 环境验证清单

完成上述配置后,建议按以下清单逐项验证,确保开发环境可用:

验证项 验证方法 预期结果
交叉编译器 arm-linux-gnueabihf-gcc --version 显示版本号,无错误
TFTP服务 tftp localhost -c get test.txt 成功下载文件
NFS服务 showmount -e localhost 显示共享目录
串口通信 连接开发板,观察minicom输出 显示U-Boot或内核启动日志
网络连通 U-Boot中执行 ping 192.168.1.100 收到响应,丢包率0%
开发效率提示: 建议将上述所有配置命令写入一个自动化脚本(如 setup_env.sh),后续在新机器上搭建环境时一键执行,避免重复劳动。