【发布时间】:2013-06-09 03:02:13
【问题描述】:
我在具有完整 MMU 的 Xilinx 的 Microblaze 上运行 Linux 内核 3.3。我正在做的任务需要我知道以下内容:我需要创建一个文本文件(缓冲区)并定位此缓冲区的物理地址,并且我不希望内核将此文件写入不连续的内存区域。
我需要这个的原因是因为我有一个 DMA 引擎,可以从预设的物理内存地址流式传输数据,所以我需要强制 Linux 在那个确切的内存位置创建缓冲区文件,这样当我将数据写入这个文件时它立即由 DMA 引擎传输到另一个硬件内核
更多细节:
我的系统有一个 512 MB DDR3 RAM 通过“Xilinx 的多端口内存控制器 (MPMC) 连接到系统。这个内存控制器的基地址是 0x90000000,系统中的所有单元都通过这个控制器访问内存,包括 MicroBlaze , 我拥有的 DMA 单元使用了一个特殊的接口,称为 Native Personality Interface (NPI),以非常低的级别与内存进行通信,从而产生非常高的速度性能。
这个 NPI DMA 单元最初设计用于一个名为“xilkernel”的非常基本的嵌入式内核,它不支持虚拟内存,MMU 也不是 MicroBlaze 的一部分,因此程序员可以看到操作系统代码将驻留在哪里并选择一个物理内存地址(例如 0x91800000)作为 DMA 将从其流式传输的源地址,然后程序员可以将文件放置在该确切地址并运行系统
当我们需要迁移项目以使用 Linux 而不是 xilkernel 时,我们遇到了这个问题,我在外部存储设备上有文件,我可以从 Linux 作为块设备访问这些文件,我需要将每个文件移动到主内存( DDR3 RAM)并使 DMA 流式传输文件。 目前 DMA 从固定地址流式传输,但如果需要,我可以将其设为通用。
【问题讨论】:
-
看一看这个 PDF 的章节,它解释了 Linux 内核如何管理虚拟和物理内存。它提供了如何为各种场景映射和固定物理内存的示例。 lwn.net/images/pdf/LDD3/ch15.pdf
-
@bromanous 这个设备是您自己开发的,还是您无法修改的第 3 方 IP 核?如果可以修改的话,我强烈建议你把DMA地址软件设置成可配置的,这样你就可以使用tian_yufen所说的标准DMA功能了。
-
@BenjaminLeinweber,是的,我有 DMA 核心的源代码,我可以配置 DMA 流的地址并将其设为通用参数。
标签: linux-kernel embedded embedded-linux mmap microblaze