【发布时间】:2010-12-28 20:04:45
【问题描述】:
Platofrm - Linux、Arch - ARM 编程语言——C/C++
目标 - 将常规(比如说文本)文件映射到 ram 中的一个预先知道的位置(物理地址),并将该物理地址传递给其他应用程序。我一次映射的块大小是 128K。
我正在尝试的方式是- 用户空间进程发出 ioctl 调用,要求设备驱动程序获取一块内存(ram),计算物理地址并将其返回给用户空间。
用户空间进程需要将文件映射到该物理地址空间 我不知道该怎么做。任何帮助表示赞赏。 ???
对文件调用 mmap 然后计算物理地址的问题是,页面在有人访问它们之前不在内存中,并且分配的物理内存页面可能不连续。
实际访问该文件的另一个进程来自第三方供应商应用程序。该应用程序要求一旦我们将物理地址传递给它,文件内容就需要存在于连续的内存中。
我现在是怎么做的 --
用户进程调用mmap到设备。 设备驱动程序执行 kmalloc,计算起始物理地址并将 VMA 映射到该物理地址。 现在用户进程读取文件并将其复制到在 mmap 期间获得的地址空间。
问题 - 文件的副本存在于 ram 中的两个位置,一个是从磁盘读取完成时,另一个是当我将它复制到使用 mmap 获得的缓冲区和相应的复制开销时。 在理想情况下,我想将文件直接从磁盘加载到已知/预定义的位置。
【问题讨论】:
-
试图重新表述这个问题:对于设备(嵌入式 Linux?),IO 有一个硬编码的物理地址范围。这个地址范围应该映射到一个文件,所以任何读取或写入文件的人都会为设备做 IO。如何将地址范围映射到文件?