【发布时间】:2014-01-14 11:41:25
【问题描述】:
我使用匿名 mmap 来分配一大块内存。我想使用虚拟内存镜像将其中的几个连续页面变成环形缓冲区。
This example on Wikipedia 显示了我所说的虚拟内存镜像的含义。
假设下面的前 14 个块是我的大块中的页面。我想将第 6 页和第 7 页虚拟映射到另外两个连续的位置。
[0][1][2][3][4][5][6][7][8][9][10][11][12][13].......[6][7][6][7]
Mike Ash 给出了我想要做的a rundown,但使用的是特定于马赫的 API。
如何在 Linux 上做到这一点?
【问题讨论】:
-
维基百科上的那个例子有什么问题?
-
@pentadecagon 我已经有一大块内存,我想镜像其中的几页。 Wikipedia 示例需要分配新内存。
-
不是真的,它只需要一个文件描述符,它可以
mmap两次,它不关心它来自哪里。这个想法是您希望完整的缓冲区被镜像(这显然是 大多数 人想要的)。如果您只想镜像内存块的一部分,只需对offset使用零以外的值。镜像页面的唯一其他可能方法是使用remap_file_pages,这也需要内存映射(所以你什么也得不到,真的)。不过你会失去一些东西……便携性。 -
@Damon 谢谢,
remap_file_pages是我要找的东西 -
@max @damon Alas,
remap_file_pages在最近的 Linux 版本中被标记为弃用。使用mmap可能更好。
标签: linux virtual-memory circular-buffer