内存映射预定义的驱动器区域

时间:2014-08-11 21:35:03

标签: c linux memory-mapping

我想使用内存映射io读取非常大的数据块。

这些大块数据来自硬盘,没有文件系统只是数据。

在我开始这整个考验之前,我想知道两件事。

  1. 是否有可能在彼此之后仅将特定部分映射到内存中然后再读取?首先我有一个硬盘驱动器,我想读取10块100mb,但每个块由1GB的数据分隔。是否有可能一个接一个地存储那些10块100mb的地图,所以我可以像它们一个接一个地访问它一样?

  2. 我可以记忆大量的数据吗?例如,假设我有一个10tb磁盘。是否可以记忆整个磁盘?我使用64位操作系统。

  3. 我希望有人能澄清一下!

1 个答案:

答案 0 :(得分:2)

在Linux上,您可以使用mmap()系统调用将文件(甚至是块设备)映射到内存中。如果您不知道mmap()的工作原理,请在继续此答案之前咨询man page

mmap()调用允许您为要创建的映射指定基址。 POSIX指定操作系统可以将此基址作为提示放置映射的位置。在Linux上,mmap()将映射放在您请求的地址上(如果它是页面边界)(即可以4096分割)。您可以指定MAP_FIXED以确保映射放置在您想要的位置,但内核可能会告诉您这是不可能的。

您可以尝试使用上述方法一个接一个地映射您想要的块,但这显然只有在您的块的大小是页面大小的倍数(即4096字节)时才有效。我不建议你这样做,因为它可能会破坏不同的页面大小/配置。

根据您的内存配置,应该可以映射整个磁盘。您可能需要为此配置系统的过度使用行为。

我建议您尝试映射整个磁盘。