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。

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) 为设备树节点:

关键参数:
- 通过 reg 参数,指定保存内存的特定范围
- 通过 no-map,指定操作系统不允许创建虚拟映射
- 通过 compatible=<shared-dma-pool>,这块内存会被用来进行 Contiguous Memory Allocator for dma
总结
本文主要介绍了 Linux 系统中通过预留物理内存实现 ARM 与 FPGA 高效通信的方法,预留物理内存包括 memreserve、Linux 内核启动参数 cmdline 和 Linux Reserved-Memory 三种方案。但在选择具体实现方式时,应根据系统的动态需求、内存管理要求和硬件特性进行权衡。
欲了解更多 Altera 相关方案或技术信息,可点击下方「联系我们」,提交您的需求,骏龙科技公司愿意为您提供更详细的技术解答。
更多信息: