当前位置:首页>Linux>【FPGA linux系列】 第二部分:ZYNQ Linux操作系统构建的核心技术详解

【FPGA linux系列】 第二部分:ZYNQ Linux操作系统构建的核心技术详解

  • 2026-09-30 16:49:27
【FPGA linux系列】 第二部分:ZYNQ Linux操作系统构建的核心技术详解

源码资源:

1、【LVDS工程源码】

2、【CORDIC工程源码】

3、【源码]FIR + EMA零 DSP,适用于极低资源消耗】

4、[源码]xilinx FPGA的高精度互相关时延估计


系列章节目录:

【FPGA linux系列】:1.1什么是嵌入式 Linux 系统?(内容乱码修正)

【FPGA linux系列】:1.2 ZYNQ 异构平台简介:软件定义仪器的硬件基石

【FPGA linux系列】1.3 项目整体架构:一套脚本如何构建出一张可启动的 SD 卡

【FPGA linux系列】1.4关键概念入门——理解嵌入式Linux系统构建的五大基石

2.1 磁盘镜像与分区原理

镜像文件的物理结构

本项目创建一个7.4GB的镜像,包含两个分区:

为什么分两个区?

  1. 兼容性:FAT16 是所有操作系统都能识别的文件系统,Windows/Mac 插入 SD 卡就能看到 boot 分区,方便修改配置
  2. 启动要求:U-Boot 只支持从 FAT 分区读取内核文件
  3. 性能:根文件系统使用 ext4(日志文件系统,更稳定高效)

2.2 Loop 设备与挂载技术

什么是 Loop 设备?

  • 普通挂载:物理设备(/dev/sda1)→ 挂载点

  • Loop 挂载:文件(.img)→ 虚拟设备(/dev/loop0)→ 挂载点

  • 这个"Loop 设备"把文件模拟成块设备

项目中的两种挂载方式

对应image.sh第 91-139 行:

# 1. 找一个空闲的 loop 设备DEVICE=$(losetup -f)# 通常返回 /dev/loop0# 2. 关联镜像文件,-P 参数自动探测分区losetup -P $DEVICE $IMAGE# 结果:#   /dev/loop0  → 整个镜像#   /dev/loop0p1 → 分区1(boot)#   /dev/loop0p2 → 分区2(root)# 3. 格式化分区mkfs.vfat /dev/loop0p1mkfs.ext4 /dev/loop0p2

对应image.sh第 145-176 行:

# 1. 读取分区表信息,计算偏移SECTOR_SIZE=512BOOT_START=8192# 扇区号(4MB / 512B = 8192)BOOT_OFFSET=$((BOOT_START * SECTOR_SIZE))# 4194304 字节# 2. 直接用 offset 挂载mount -o loop,offset=$BOOT_OFFSET,sizelimit=$BOOT_SIZE $IMAGE $BOOT_DIR

为什么用两种方式?

  • 分区和格式化阶段用 losetup -P(简单直接)
  • 系统安装阶段用 offset(更稳定,避免 loop 设备被占用问题)

2.3 chroot 环境原理解析

chroot 的完整配置流程

对应ubuntu.sh第 69-80 行:

# 步骤 1:复制 DNS 配置(新系统也需要上网下载软件)cp /etc/resolv.conf $ROOT_DIR/etc/# 步骤 2:复制 QEMU 模拟器(让 ARM 程序能运行)cp /usr/bin/qemu-arm-static $ROOT_DIR/usr/bin/# 步骤 3:挂载系统目录(chroot 内的进程需要这些)sudo mount -o bind /dev/      ”${ROOT_DIR}/dev/”# 设备文件sudo mount -o bind /dev/pts   ”${ROOT_DIR}/dev/pts”# 伪终端(SSH 需要)sudo mount -t proc proc       ”${ROOT_DIR}/proc/”# 进程信息(ps 命令需要)sudo mount -t sysfs sys       ”${ROOT_DIR}/sys/”# 系统信息sudo mount -o bind /run       ”${ROOT_DIR}/run”# 运行时数据

进入 chroot 的写法

chroot $ROOT_DIR <<- EOF_CHROOT# 这里面的命令都在新系统内执行!# /usr/bin/apt-get 实际上是 $ROOT_DIR/usr/bin/apt-getapt-get updateapt-get install -y vim# ... 其他命令EOF_CHROOT

注意事项:

  1. 离开 chroot 后必须卸载这些挂载的目录,否则下次会出错
  2. 卸载顺序要逆序:先卸 /run,再卸 /sys ... 最后卸 /dev

2.4 QEMU 用户态模拟

为什么需要?

我们在 x86 主机上执行:

  1.   chroot $ROOT_DIR /usr/bin/apt-get install vim

  2.   apt-get 是 ARM 二进制文件(因为 ROOT_DIR 是 ARM Ubuntu)

  3.   x86 CPU 不能直接执行 ARM 指令 → 会报错 "Exec format error"

binfmt_misc 的魔法

Linux 内核有个功能叫binfmt_misc,可以注册"文件格式处理器":

注册规则:1、如果文件是 ARM ELF 格式 2、用 /usr/bin/qemu-arm-static 来执行它结果:  1、当你执行 /usr/bin/apt-get(ARM 程序)  2、内核自动调用:/usr/bin/qemu-arm-static /usr/bin/apt-get  3、翻译执行,就像在 ARM 机器上一样!

这就是为什么在 chroot 前要复制 qemu-arm-static 到 $ROOT_DIR/usr/bin/。

验证方法

# 进入 chroot 后执行uname -m# 应该输出:armv7l (ARM 架构)# 而不是:x86_64(宿主机架构)

2.5 Docker 容器化构建

为什么使用 Docker?

构建过程需要:

losetup、mount、chroot 等 root 权限操作
  • 安装大量工具(qemu、parted、gcc 等)
  • 在 x86 Ubuntu 上执行(特定版本最好)

Docker 保证:任何人、任何机器,构建环境完全相同。

Dockerfile 设计思路

对应Dockerfile:

# 1. 基础镜像:官方 Ubuntu 24.04FROM ubuntu:24.04# 2. 安装构建工具链(一次安装,重复使用)RUN apt-get update && apt-get install -y \    bc bison build-essential curl qemu-user-static ...# 3. 复制项目文件(让容器包含所有构建脚本)COPY build.sh /build/COPY debian/ /build/debian/# 4. 启动时执行构建WORKDIR /buildCMD [”./build.sh”]

容器需要的特殊权限

docker run \  --privileged# 必须!需要 mount、losetup 等特权操作  -v /dev:/dev# 必须!访问宿主机的 loop 设备  -v $(pwd)/artifacts:/artifacts# 可选,把产物映射出来  redpitaya-ubuntu-os-builder

2.6 systemd 服务管理

Red Pitaya 启动流程

overlay 目录中的服务配置

项目把所有自定义服务放在overlay/etc/systemd/system/:

服务文件
功能
redpitaya_nginx.service
Red Pitaya Web 界面(Bazaar)
redpitaya_scpi.service
SCPI 远程控制接口
sockproc.service
进程通信代理(让 Lua 能执行 shell 命令)
jupyter.service
Jupyter Notebook 服务器
hostname-mac.service
根据 MAC 地址生成唯一主机名
ssh-reconfigure.service
首次启动时生成 SSH 密钥
wireless-mode-ap.service
WiFi AP 模式切换

启用服务的命令:

systemctl enable jupyter# → 在 /etc/systemd/system/multi-user.target.wants/ 创建软链接# → 下次启动时自动运行

✨ 如果本文对你有帮助

  • 点赞支持,让更多人看到
  • 收藏起来,随时查阅
  • 留言讨论,分享你的使用经验
  • 关注我们,获取更多嵌入式实战干货
  • 感谢阅读!我们下一篇文章见!

推荐合集阅读

👇


嵌入式-实用的FreeRTOS学习指南

人工智能合集

FPGA技术分享

latex教程

LVDS

FPGA+LINUX+人工智能


下载资料请扫码进小程序,正在内测中.......

最新文章

随机文章