Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将文件映射到ram_C++_C_Linux_Mmap - Fatal编程技术网

C++ 将文件映射到ram

C++ 将文件映射到ram,c++,c,linux,mmap,C++,C,Linux,Mmap,Platofrm-Linux,Arch-ARM 编程语言-C/C++ 目标-将一个常规(比如文本)文件映射到ram中的一个已知位置(物理地址),并将该物理地址传递给其他应用程序。我一次映射的块的大小是128K 我想说的是- 用户空间进程发出ioctl调用,要求设备驱动程序获取内存块(ram),计算物理地址并将其返回到用户空间 用户空间进程需要将文件映射到该物理地址空间 我不知道该怎么办。非常感谢您的帮助。 对文件进行mmap调用,然后计算物理地址的问题是,在有人访问页面之前,页面不在内存中,分配

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

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

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

用户空间进程需要将文件映射到该物理地址空间 我不知道该怎么办。非常感谢您的帮助。

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

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

我现在是怎么做的--

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

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

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

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

也许类似于
MADV\u SEQUENTIAL
建议参数的方法会有所帮助

需要考虑的一些事项:

  • 要映射的文件有多大
  • 这可能会影响您获取连续RAM块的能力,即使您采用基于内核驱动程序的方法
  • 对于基于内核驱动程序的方法,性能良好的驱动程序通常不应
    kmalloc()
    ,例如,为了获得超过32KB的连续内存块。此外,您通常不能
    kmalloc()。这适合你的需要吗
  • 如果您需要非常大的内存块,内核的
    alloc\u bootmem()
    函数可能会有所帮助,但它只适用于静态的“内置”驱动程序,而不适用于动态加载的驱动程序
  • 有没有什么方法可以重新设计,这样就不需要一大块连续的映射内存了

尝试重新表述这个问题:对于设备(嵌入式Linux?),IO有一个硬编码的物理地址范围。此地址范围应映射到文件,因此任何读取或写入该文件的人都将为设备执行IO。如何将地址范围映射到文件?是的,没错。我正按照你建议的方法做这件事。唯一的问题是,文件的副本同时存在于ram中的两个不同位置,而且还存在所有额外的复制开销等。。我正在尝试将从磁盘读取的文件直接加载到一个预先已知的位置(物理内存),以避免在物理内存中额外复制文件和相应的开销。为什么不将
mmap
返回的缓冲区地址传递到
read
,以便直接读取到那里?是的。。说得好,我从来没有提到我试图绘制的街区的大小。我不会超过128K。我的内核驱动程序方法目前运行良好。我编辑了我的问题来说明我现在做得如何,为什么这不是一个完美的解决方案。madvise看起来很有趣,我没有意识到这一点。