【问题标题】:Memory mirroring for a ring buffer on LinuxLinux 上环形缓冲区的内存镜像
【发布时间】: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


【解决方案1】:

这是不可能通过匿名映射实现的。但是,您可以使用memfd_create(2) 或在 tmpfs 上创建一个临时文件(这样它就永远不会存储到磁盘,除非通过“交换”)并在该文件描述符上进行共享映射,彼此相邻。

remap_file_pages(2) 只是一种性能黑客,并不比经典的 mmap/mremap 调用更强大,它也不能对匿名映射进行操作。

相关:Linux mremap without freeing the old mapping?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 2012-04-04
    相关资源
    最近更新 更多