将文件映射到ram

时间:2009-12-21 17:59:02

标签: c++ c linux mmap

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

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

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

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

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

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

我现在是怎么做的 -

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

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

2 个答案:

答案 0 :(得分:1)

“映射文件”意味着使用虚拟地址而不是物理地址,因此不会按照您的意愿进行操作。

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

答案 1 :(得分:1)

类似madvise()MADV_SEQUENTIAL建议参数之类的内容可能会有所帮助吗?

需要考虑的一些事项:

  • 您要映射的文件有多大?
  • 这可能会影响您获取连续RAM块的能力,即使您采用基于内核驱动程序的方法也是如此。
  • 对于基于内核驱动程序的方法,表现良好的驱动程序通常不应kmalloc()例如来获取超过32KB的连续内存块。此外,您通常不能kmalloc()超过2MB(我已经尝试过这个:))。这是否适合您的需求?
  • 如果你需要一个非常大的内存块,比如内核的alloc_bootmem()函数可以提供帮助,但它只适用于静态“内置”驱动程序,而不是动态可加载的驱动程序。
  • 你有什么方法可以重新设计你的设计,以便不需要一个大的连续的映射内存块吗?