我在带有完整 MMU 的 Xilinx 的 Microblaze 上运行 Linux 内核 3.3。我正在做的任务需要我知道以下内容:我需要创建一个文本文件(缓冲区)并定位此缓冲区的物理地址,并且我不希望内核将此文件写入不连续的内存区域。
我需要这个的原因是因为我有一个 DMA 引擎,可以从预设的物理内存地址流式传输数据,所以我需要强制 Linux 在那个确切的内存位置创建缓冲区文件,这样当我将数据写入这个文件时,它会立即传输由 DMA 引擎传输到另一个硬件内核
更多细节:
我的系统有一个 512 MB DDR3 RAM 通过“Xilinx 的多端口内存控制器(MPMC)连接到系统。这个内存控制器的基地址是 0x90000000,系统中的所有单元都通过这个控制器访问内存,包括 MicroBlaze,DMA我拥有的单元使用称为本机个性接口(NPI)的特殊接口在非常低的级别与内存进行通信,从而产生非常高的速度性能。
这个 NPI DMA 单元最初设计用于一个非常基本的嵌入式内核“xilkernel”,它不支持虚拟内存,MMU 都不是 MicroBlaze 的一部分,因此程序员可以看到 OS 代码将驻留在哪里并选择物理内存诸如 0x91800000 之类的地址作为 DMA 将从其流式传输的源地址,然后程序员可以在该确切地址中放置一个文件并运行系统
当我们需要迁移项目以使用 Linux 而不是 xilkernel 时,我们遇到了这个问题,我在外部存储设备上有文件,我可以从 Linux 作为块设备访问,我需要将每个文件移动到主存储器(DDR3 RAM)并使 DMA 流成为文件。目前 DMA 从固定地址流式传输,但如果需要,我可以将其设为通用。