c++ - 将文件映射到ram

标签 c++ c linux mmap

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

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

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

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

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

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

我现在是怎么做的 --

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

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

最佳答案

“映射文件”意味着使用虚拟地址而不是物理地址,因此这不会达到您想要的效果。

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

关于c++ - 将文件映射到ram,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1941623/

相关文章:

c++ - g++模板问题

C++ bool 数组返回 1 或 0 以外的值

c++ - 删除堆然后取消引用指向该内存的指针

c - 如何使用内核模块直接访问保留内存?

c - Linux 中的 fork() 函数

linux - 安装Qt 4 ubuntu 17.04

linux - 在其他线程正在处理时保持主线程(Qt 应用程序)响应(POSIX)

c++ - 通过 boost lambda 占位符访问成员变量

c++ - 按位运算n&(n-1)有什么作用?

linux - 使用bcd在分区中启动