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

标签 c linux memory-mapping

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

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

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

  1. 是否可以仅将特定部分内存映射到内存中,然后依次读取?首先,我有一个硬盘驱动器,我想在其中读取 10 个 100mb 的 block ,但每个 block 都由 1gb 的数据分隔。是否可以将这 10 个 100mb 的 block 一个接一个地进行内存映射,这样我就可以像一个接一个地访问它一样访问它?

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

希望有人能说清楚!

最佳答案

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

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

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

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

如果映射整个磁盘有效,我建议您尝试一下。

关于c - 内存映射预定义的驱动器区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25252815/

相关文章:

c++ - 使用 Ptrace 检索系统调用,在第一个调用后停止

linux - 将 shell 脚本的输出重定向到文本文件

python - 为什么我每次打开新终端时都必须返回 "source vitrualenvwrapper.sh"?

Linux - 在内核代码中映射用户空间内存

c++ - 在 mmap 区域上使用 memcpy 会崩溃,for 循环不会

c - 内存分配如何在极端情况下工作?

c - 在数组中存储奇数和偶数

io - 内存映射 IO 与 DMA?

c - 需要练习基于线性链表求解

使用 char 指针更改 int 值