Platofrm - Linux,Arch - ARM 编程语言 - C / C ++
目标 - 将常规(简称文本)文件映射到ram中的预先知道的位置(物理地址),并将该物理地址传递给其他应用程序。我一次映射的块的大小是128K。
我想要的方式是 - 用户空间进程发出ioctl调用,要求设备驱动程序获取一块内存(ram),计算物理地址并将其返回给用户空间。
用户空间进程需要将文件映射到该物理地址空间 我不知道该怎么做。感谢任何帮助。 ???
对文件进行mmap调用然后计算物理地址的问题是,在有人访问它们并且分配的物理内存页可能不连续之前,页面不在内存中。
实际访问该文件的另一个进程来自第三方供应商应用程序。该应用程序要求一旦我们传递物理地址,文件内容就需要存在于连续的内存中。
我现在是怎么做的 -
用户进程将mmap调用到设备。 设备驱动程序执行kmalloc,计算起始物理地址并将VMA映射到该物理地址。 现在,用户进程读取文件并将其复制到mmap期间获得的地址空间。
问题 - 文件的副本存在于ram中的两个位置,一个是从磁盘读取时,另一个是当我将其复制到使用mmap和相应的复制开销获得的缓冲区时。 在理想的世界中,我希望将文件直接从磁盘加载到已知/预定义的位置。
答案 0 :(得分:1)
“映射文件”意味着使用虚拟地址而不是物理地址,因此不会按照您的意愿进行操作。
如果要将文件内容放入连续的物理内存块中,只需在获得连续缓冲区后使用open()
和read()
。
答案 1 :(得分:1)
类似madvise()
和MADV_SEQUENTIAL
建议参数之类的内容可能会有所帮助吗?
需要考虑的一些事项:
kmalloc()
,例如来获取超过32KB的连续内存块。此外,您通常不能kmalloc()
超过2MB(我已经尝试过这个:))。这是否适合您的需求?alloc_bootmem()
函数可以提供帮助,但它只适用于静态“内置”驱动程序,而不是动态可加载的驱动程序。