【问题标题】:How to share a part of memory using mmap如何使用 mmap 共享部分内存
【发布时间】:2020-04-15 16:50:45
【问题描述】:

我有 3 个工具,我需要它们共享相同的前 4096 字节自己的内存。 每个工具都可以独立增加内存。

所以一份简历:

工具1:

0 - 4096 :在 1,2,3 之间共享

4097 - 8192:1 内部

工具2:

0 - 4096 :在 1,2,3 之间共享

4097 - 16384:2 内部

工具3:

0 - 4096 :在 1,2,3 之间共享

4097 - 12288:3 内部

是否可以使用 mmap 来实现我的目标,因为我更喜欢 mmap ? 如果有其他解决方案,也许我可以调整我的代码。

提前感谢您的帮助。

【问题讨论】:

  • 我需要他们共享自己内存的前 4096 个字节“他们自己的内存”是什么意思?我假设您的意思是堆内存之类的东西,因为进程的 first 4096 字节是地址 0x00000000 并且该页面受读/写保护。当您使用mmap 时,您可以获得一个指向您的程序之间共享的区域的指针。但是,具体地址不应该是一个问题。如果是,为什么?您应该在问题中发布您的代码,并就其操作提出 [更多] 具体问题。
  • 我的意思是 0 是每个工具中一种线性内存的开始。所以,0是每个内存工具使用的起始指针。
  • “一种线性记忆”是什么意思?在一个进程内,所有内存都是线性的。我认为您接近 XY 问题:mywiki.wooledge.org/XyProblem 所以,忘记mmap 等。人。暂时描述一下你想要实现的什么。 (例如)“我正在编写需要共享学生数据的程序”您的需要是什么? mmap 是满足需求的解决方案

标签: c linux mmap


【解决方案1】:

映射和使用虚拟内存的第一页存在严重的安全性和可维护性问题,但如果你真的愿意,你可以这样做。

首先你需要调整一个 sysctl 来阻止你做这样的事情(有充分的理由):

sudo sysctl -w vm.mmap_min_addr=0

然后像通常用于共享内存一样使用mmap,但使用MAP_FIXED。现在您可以读取和写入第一页(包括 NULL 指针):

#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>

int main()
{
        int fd = shm_open("silly_example", O_RDWR | O_CREAT, 0600);
        mmap(0, 4096, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, fd, 0);
        ftruncate(fd, 4096);
        int *ptr = (int*) 0;
        *ptr = 123;
        printf("%d\n", *ptr);
        getchar();
}

您可以验证映射是否已创建:

$ cat /proc/17444/maps
00000000-00001000 rw-s 00000000 00:12 41774576                           /dev/shm/silly_example

以这种方式映射共享文件的所有进程将共享 4096 字节的内存(映射到零页)。我在本例中使用了 POSIX 共享内存,但您可以使用任何文件,只要将其截断为 4096 字节即可。

您应该认真考虑您要做什么,以及是否真的有必要这样做。

【讨论】:

  • 我的意思是 0 是每个工具中一种线性内存的开始。因此,0 是每个内存工具使用的起始指针。但是如何共享前 4096 个字节以及如何在内部保护添加的内存不被其他 2 个工具访问。
  • 程序中NULL指针是一个常量零值;它与恰好为零的变量地址区分开来。 Malloc、fopen 等永远不应该返回零,因为这将等于它们的 NULL 错误返回。但是,没有理由 &x 不能为零。
  • @Alphapage:我不确定我是否理解你的问题。通过在所有三个进程中运行上述代码,前 4096 字节的内存将在它们之间共享,但不会共享所有其他内存。你可以 MAP_ANON | MAP_FIXED 每个进程中的其他内存,它只能在内部访问。默认情况下,在 linux 中,内存在进程之间共享
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-30
  • 2014-02-14
  • 1970-01-01
  • 2014-10-01
  • 2018-05-07
  • 2021-05-16
  • 2010-11-10
相关资源
最近更新 更多