0

Platofrm - Linux, Arch - ARM 编程语言 - C/C++

目标 - 将常规(比如说文本)文件映射到 ram 中的一个预先知道的位置(物理地址),并将该物理地址传递给其他应用程序。我一次映射的块大小为 128K。

我尝试的方式是-用户空间进程发出 ioctl 调用以要求设备驱动程序获取一块内存(ram),计算物理地址并将其返回给用户空间。

用户空间进程需要将文件映射到该物理地址空间 我不知道该怎么做。任何帮助表示赞赏。???

对文件调用 mmap 然后计算物理地址的问题是,页面在有人访问它们之前不在内存中,并且分配的物理内存页面可能不连续。

实际访问该文件的另一个进程来自第三方供应商应用程序。该应用程序要求一旦我们将物理地址传递给它,文件内容就需要存在于连续的内存中。

我现在是怎么做的——

用户进程调用 mmap 到设备。设备驱动程序执行 kmalloc,计算起始物理地址并将 VMA 映射到该物理地址。现在用户进程对文件进行读取并将其复制到在 mmap 期间获得的地址空间。

问题 - 文件的副本存在于 ram 中的两个位置,一个是从磁盘读取完成,另一个是当我将其复制到使用 mmap 获得的缓冲区和相应的复制开销时。在理想的世界中,我想将文件直接从磁盘加载到已知/预定义的位置。

4

2 回答 2

1

“映射文件”意味着使用虚拟地址而不是物理地址,所以这不会做你想要的。

如果要将文件内容放入连续的物理内存块中,只需在获得连续缓冲区后使用open()andread()即可。

于 2009-12-21T22:06:55.787 回答
1

也许像建议论点这样的东西会有所帮助madvise()MADV_SEQUENTIAL

需要考虑的一些事项:

  • 您要映射的文件有多大?
  • 即使您采用基于内核驱动程序的方法,这也可能会影响您获得连续 RAM 块的能力。
  • 对于基于内核驱动程序的方法,性能良好的驱动程序通常不应该获得超过 32KB 的连续内存kmalloc()。此外,您通常不能超过 2MB(我已经尝试过这个:))。这会适合您的需求吗?kmalloc()
  • 如果您需要一个非常大的内存块,类似内核的alloc_bootmem()函数可能会有所帮助,但它仅适用于静态“内置”驱动程序,而不适用于动态可加载的驱动程序。
  • 有什么方法可以重新设计你的设计,这样就不需要大的连续映射内存块了吗?
于 2009-12-21T23:03:42.850 回答