基础环境篇 – 交叉编译环境搭建与NFS服务配置

欢迎来到系统移植专栏的第一篇文章,本文介绍了嵌入式开发中交叉编译环境的搭建方法。首先解释了交叉开发环境的概念,即在PC上编译程序、在目标开发板上运行的开发模式,并分析了其必要性。然后详细说明了交叉编译工具链arm-linux-gnueabihf-gcc的组成、下载安装步骤及环境变量配置方法。最后重点讲解了NFS网络文件系统的搭建过程,包括NFS服务器的安装、共享目录配置和本地测试方法,以实现在开发阶段避免频繁烧写存储设备的目的。这些内容是嵌入式系统开发的基础环境配置,为后续开发工作奠定基础。专栏后续还会持续发布关于更详尽的干货内容,欢迎大家持续关注!!!


一、交叉编译环境的概率

1.交叉环境是什么?

在嵌入式开发中,交叉开发是很重要的一个概念,开发的第一个环节就是搭建环境,第一步不能完成,后面的步骤从无谈起,这里所说的交叉开发环境主要指的是:在开发主机(PC)上编写、编译程序,在目标机(开发板)上运行程序的环境。


2.为什么需要交叉开发环境?

**原因1:**嵌入式硬件资源有限(CPU主频低、内存小),PC开发效率更高。

**原因2:**目标机架构(如ARM)与主机(x86)不同,需用交叉编译工具生成对应指令集的程序。


3.交叉开发环境的硬件组成主要由以下几大部分

  • 开发主机
  • 目标机(开发板)
  • 二者的链接介质,常用的主要有3种方式:串口线 、USB线 、网线

4.对应的硬件介质,还必须要有相应的软件"介质"支持:

  • 串口:Putty、串口调试助手等

  • USB:芯片厂商提供的驱动(如三星DNW)

  • 网线:依赖网络协议,常用两种服务

    • tftp:将bootloader、内核、文件系统下载到内存运行,避免频繁烧写Flash

    • nfs:将主机上的根文件系统挂载到开发板,方便测试,无需烧录


二、认识交叉编译工具链(arm-linux-gnueabihf-gcc)

最常用的ARM交叉编译器是 arm-linux-gnueabihf-gcc,其中:

  • arm:目标架构

  • linux:目标操作系统

  • gnueabihf:使用glibc库,硬件浮点(hard float)支持

我们在本系列中使用的是 4.9.4 版本

工具链中还包含了:

  • arm-linux-gnueabihf-ld:链接器

  • arm-linux-gnueabihf-objcopy:格式转换

  • arm-linux-gnueabihf-gdb:调试器

  • 等等


三、安装交叉编译工具链的流程

1.下载与解压交叉编译工具链

通常工具链可由厂家提供,或从 Linaro 官网下载。假设我们已获得压缩包 gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz

创建工作目录(可选)

mkdir ~/tools

cd ~/tools

解压(根据压缩格式选择参数,.tar.xz使用-Jxvf)

tar -Jxvf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz

解压后会生成一个目录,例如 gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf


2.配置环境变量(永久生效)

为了让系统在任何路径下都能找到交叉编译工具,需要将工具链的 bin 目录添加到 PATH 环境变量中。

vim ~/.bashrc

在文件末尾添加以下内容(根据你的实际路径修改)

export PATH=$PATH:/home/your_username/tools/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin

保存退出后,执行

source ~/.bashrc //在当前终端会话中,重新加载并执行 ~/.bashrc 文件里的所有命令。

**验证环境变量是否添加成功:**应能看到你添加的路径出现在输出中。

echo $PATH
PATH 是 Linux/Unix 系统中的一个环境变量 ,它保存了一系列目录路径 (用冒号 : 分隔)。当你在终端输入一个命令(比如 lsgccarm-linux-gnueabihf-gcc)时,系统会按照 PATH 中列出的目录顺序,依次在这些目录里寻找与命令同名的可执行文件,并执行第一个找到的。

echo $PATH 的作用

  • echo 是输出字符串的命令。

  • $PATH 表示引用变量 PATH 的值($ 是取值符号)。

  • 整体作用就是把当前 PATH 的内容打印到屏幕上,方便你查看系统会在哪些路径下查找命令。


3.验证交叉编译工具链是否安装成功

输入以下命令,能看到版本信息即表示成功:

arm-linux-gnueabihf-gcc -v


四、搭建NFS网络文件系统

1.什么是NFS?

NFS(Network File System,网络文件系统) 是一种分布式文件系统协议,允许一台计算机(客户端)通过网络访问另一台计算机(服务器)上的文件和目录,就像访问本地存储一样。

2.为什么需要NFS?

在系统移植调试阶段,我们经常需要快速更新根文件系统。通过NFS(Network File System)将Ubuntu上的某个目录作为开发板的根文件系统挂载,可以避免反复烧写EMMC/SD卡,极大提高开

发效率。

3.安装NFS服务器

复制代码
sudo apt-get update
sudo apt-get install nfs-kernel-server -y

4.配置导出目录(/etc/exports)

假设我们将 /home/linux/nfs/rootfs 作为共享的根文件系统目录。

复制代码
sudo mkdir -p /home/linux/nfs/rootfs
sudo vim /etc/exports

添加以下内容(根据你的实际IP网段调整):

复制代码
/home/linux/nfs/rootfs *(rw,sync,no_subtree_check,no_root_squash)
  • * :允许所有客户端访问(谨慎用于开发环境,也可限制为特定网段,如192.168.1.0/24)

  • rw :读写权限

  • sync :同步写入

  • no_root_squash :允许客户端root用户拥有服务器上对应目录的root权限(开发用)

5.重启NFS服务

复制代码
sudo /etc/init.d/nfs-kernel-server restart

6. 本地测试NFS挂载

在Ubuntu本机上测试是否能够挂载刚刚导出的目录:

复制代码
sudo mount -t nfs localhost:/home/linux/nfs/rootfs /mnt
ls /mnt   # 查看内容,应该能看到rootfs下的文件(可能目前为空)
sudo umount /mnt   #以超级用户权限卸载挂载在 /mnt目录上的文件系统。

如果挂载成功,说明NFS服务已正常工作。后面在uboot中设置 bootargs 即可让开发板通过NFS挂载根文件系统(将在本专栏后续文章详细讲解)。

相关推荐
极创信息1 小时前
信创领域五种主流CPU架构(X86 / ARM / RISC-V / MIPS / LoongArch)
java·arm开发·数据库·spring boot·mysql·软件工程·risc-v
AI服务老曹2 小时前
节省95%开发成本:支持X86/ARM与GPU/NPU异构部署的AI视频云网关架构深度解析
arm开发·人工智能·音视频
徐某人..16 小时前
基于i.MX6ULL平台的智能网关系统开发
arm开发·c++·单片机·qt·物联网·学习·arm
2035去旅行17 小时前
嵌入式开发,如何选择C标准库
linux·arm开发
进击的小头20 小时前
20_第20篇:嵌入式外设驱动开发基础:寄存器级开发与库函数开发对比实战
arm开发·驱动开发·单片机
AI服务老曹1 天前
架构实战:如何构建支持X86/ARM及异构GPU/NPU的跨平台企业级AI视频管理系统?
arm开发·人工智能·架构
ai产品老杨1 天前
【架构深研】如何构建兼容X86/ARM与异构算力的AI视频中台?基于GB28181与边缘计算的源码交付实践
arm开发·人工智能·架构
ai产品老杨1 天前
解构企业级AI视频中台:基于X86/ARM与GPU/NPU异构架构的深度演进与源码交付实践
arm开发·人工智能·音视频
Smart-佀2 天前
涨薪秘技:智能家居中的BLE协议与实现
网络·arm开发·嵌入式硬件·microsoft