文章来源 Cytech Engineer

Linux 中 ARM 与 FPGA 通信的预留内存三种实现方案

应用背景

在嵌入式系统开发中,ARM 和 FPGA 之间的通信可以使用 ARM 侧的 DDR 作为通道。由于 FPGA 也可以直接访问到 ARM 侧 DDR,但 DDR 作为共享通信时,就不能被操作系统的内存管理子系统管理。因此,需要预留一部分物理内存,使其不被内核管理。接下来将为大家详细介绍在 Linux 系统中通过预留物理内存实现 ARM 与 FPGA 高效通信的方法,预留物理内存包括 memreserve、Linux 内核启动参数 cmdline 和 Linux Reserved-Memory 三种方案。

Linux 内存管理概述

Linux 内存管理的主要目标是满足进程 (Process) 对内存的需求,同时最大限度地利用有限的内存资源。为了实现这个目标,Linux 内存管理采用了一系列的技术和策略,包括虚拟内存 (Virtual Memory)、页式内存管理 (Paging)、交换空间 (Swap Space) 等。

 

在 Linux 内存管理内部是一个复杂的系统,由多个组件和子系统构成,共同协作,实现高效的内存使用。其中包含物理内存管理 (Physical Memory Management),虚拟内存管理 (Virtual Memory Management),内存分配器 (Memory Allocator),交换空间管理 (Swap Space Management)。通过内存管理系统,整个物理内存被有效管理。默认情况下,是对整个物理内存进行管理。

 

为特定的应用或者设备预留一部分物理内存做指定用途,这部分内存不受 Linux 内存系统管理,在需要使用的时候再对这部分内存进行管理,这就是内核中提供的 Reserved Memory 机制。

预留内存三种方法

1. Memreserve

通过设备树的 memreserve 分配的内存,无法再被操作系统使用。因此这种方案不建议在共享 DDR 的方案中使用。如内核源码目录下 arch/arm/boot/dts/socfpga_cyclone5.dtsi

图1 CycloneV SoC 设备树 Memreserve 节点
图1 CycloneV SoC 设备树 Memreserve 节点

2. Linux 内核启动参数 cmdline

Linux 内核启动参数 cmdline 提供了启动选项。其中 mem 选项用来设置系统内存的 size,也即操作系统管理的物理内存 size。当 mem 指定的 size 小于实际物理内存 size,剩余的部分不受 Linux 的内存管理系统管理。如 SoC FPGA 有 4G 物理内存,当 mem=3G 时,末尾的 1G 高端内存,不受操作系统管理。

3. Linux Reserved Memory 预留内存机制

Reserved Memory,顾名思义,把系统中的一部分内存保留,内核不会为它建立页表,在内核初始化过程中,解析该 reserved-memory 节点时,会将该段地址从 memblock 模块中移除。一般应用程序不能访问这段内存。如内核源码目录下 arch/arm64/boot/dts/altera/socfpga_stratix10.dtsi,下图 (图2) 为设备树节点:

图2 设备树节点
图2 设备树节点

关键参数:

  • 通过 reg 参数,指定保存内存的特定范围
  • 通过 no-map,指定操作系统不允许创建虚拟映射
  • 通过 compatible=<shared-dma-pool>,这块内存会被用来进行 Contiguous Memory Allocator for dma

总结

本文主要介绍了 Linux 系统中通过预留物理内存实现 ARM 与 FPGA 高效通信的方法,预留物理内存包括 memreserve、Linux 内核启动参数 cmdline 和 Linux Reserved-Memory 三种方案。但在选择具体实现方式时,应根据系统的动态需求、内存管理要求和硬件特性进行权衡。

 

欲了解更多 Altera 相关方案或技术信息,可点击下方「联系我们」,提交您的需求,骏龙科技公司愿意为您提供更详细的技术解答。

更多信息: