mmap()拥有内存块

时间:2012-12-11 05:21:16

标签: c linux unix mmap

我调用了mmap(),我尝试使用MAP_ANONYMOUS映射64MB,如下所示:

void *block = mmap(0, 67108864, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (block == MAP_FAILED)
    exit(1);

我理解为了实际拥有内存,我需要点击那块内存。我想添加一些0或空字符串来实际拥有内存。我该怎么办?我尝试了以下内容,但这显然是段错误(我知道它为什么会这样做):

char *temp = block;
for (int i = 0; i < 67108864; i++) {
    *temp = '0';
    temp++;
}

如何通过在该块中分配内容来实际获得该块的所有权?

谢谢!

2 个答案:

答案 0 :(得分:3)

你的进程已拥有内存,但我认为你想要的是让它成为常驻内存。也就是说,您希望内核为mmap ed区域分配物理内存。

内核为进程分配一个虚拟内存区域(VMA),但这只是指定了一个有效区域,并没有实际分配物理页面(或者有时也称为帧)。要使内核在页表中分配条目,您需要做的就是强制页面错误。

强制页面错误的最简单方法是触摸内存,就像你正在做的那样。但是,因为你的页面大小几乎肯定是4096字节,所以你真的只需要每4096字节读取一个字节,从而减少你实际需要做的工作量。

最后,因为您正在设置页面PROT_READ,所以您实际上想要从每个页面读取而不是尝试写入。

答案 1 :(得分:1)

你的问题不是很好。我不明白为什么你认为这个过程没有通过mmap 获得记忆?

您的新mmap内存区域只有PROT_READ(因此您只需读取内部的零),您需要PROT_READ|PROT_WRITE才能在内部写入。< / p>

但是,mmap返回后,您的进程已“拥有”内存。

如果进程有pid 1234,您可以通过cat /proc/1234/maps顺序读取(可能在不同终端中使用/proc/1234/maps)其内存映射;在您的流程中,使用/proc/self/maps

也许你对memory overcommit感兴趣;有一种方法可以禁用它。

也许mincore(2)msync(2)mlock(2)系统调用很有趣。

也许您想要mmap(2)

MAP_POPULATEMAP_LOCKED标志

我实际上不明白为什么你在你的问题中说“拥有记忆”,我不太了解。如果您只想禁用内存过量使用,请告诉。

您可能还mmap了一些文件段。我相信在这种情况下不可能过度使用。但我建议通过/proc/sys/vm/overcommit_memory来禁用整个系统中的内存过量使用。