时间:2025-04-16 13:42
人气:
作者:admin
应用背景
在开发中, 和 之间的可以使用 ARM 侧的 作为通道。由于 FPGA 也可以直接访问到 ARM 侧 DDR,但 DDR 作为共享通信时,就不能被的内存管理子系统管理。因此,需要预留一部分物理内存,使其不被内核管理。接下来将为大家详细介绍在 系统中通过预留物理内存实现 ARM 与 FPGA 高效通信的方法,预留物理内存包括 memreserve、Linux 内核启动参数 cmdline 和 Linux Reserved-Memory 三种方案。
Linux 内存管理概述
Linux 内存管理的主要目标是满足进程 (Process) 对内存的需求,同时最大限度地利用有限的内存资源。为了实现这个目标,Linux 内存管理采用了一系列的技术和策略,包括虚拟内存 (Virtual Memory)、页式内存管理 (Paging)、交换空间 (Swap Spe) 等。
在 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 节点
2. Linux 内核启动参数 cmdline
Linux 内核启动参数 cmdline 提供了启动选项。其中 mem 选项用来设置系统内存的 size,也即操作系统管理的物理内存 size。当 mem 指定的 size 小于实际物理内存 size,剩余的部分不受 Linux 的内存管理系统管理。如 SoC FPGA 有 物理内存,当 mem=3G 时,末尾的 1G 高端内存,不受操作系统管理。
3. Linux Reserved Memory 预留内存机制
Reserved Memory,顾名思义,把系统中的一部分内存保留,内核不会为它建立页表,在内核初始化过程中,解析该 reserved-memory 节点时,会将该段地址从 memblock 模块中移除。一般应用程序不能访问这段内存。如内核源码目录下arch/arm64/boot/dts//socfpga_strax10.dtsi,下图 (图2) 为设备树节点:
图2 设备树节点
关键参数:
通过 reg 参数,指定保存内存的特定范围
通过 no-map,指定操作系统不允许创建虚拟映射
通过 compatible=,这块内存会被用来进行 Contiguous Memory Allocator for
总结
本文主要介绍了 Linux 系统中通过预留物理内存实现 ARM 与 FPGA 高效通信的方法,预留物理内存包括 memreserve、Linux 内核启动参数 cmdline 和 Linux Reserved-Memory 三种方案。但在选择具体实现方式时,应根据系统的动态需求、内存管理要求和硬件特性进行权衡。
Fidus Sidewinder-100集成PCIe NVMe 控制系统,有