0

我调用了 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++;
}

我如何通过在该块中分配某些东西来实际获得该块的所有权?

谢谢!

4

2 回答 2

3

您的进程已经拥有内存,但我认为您想要的是使其常驻。也就是说,您希望内核为mmaped 区域分配物理内存。

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

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

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

于 2012-12-11T06:15:30.747 回答
1

你的问题表述的不是很好。我不明白为什么您认为该过程不拥有通过获得的内存mmap

你新的mmap记忆区只有PROT_READ(所以你可以读里面的零),你需要它才能在PROT_READ|PROT_WRITE里面写。

但是一旦mmap返回,您的进程就已经“拥有”了内存。

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

也许您对内存过量使用感兴趣;有一种方法可以禁用它。

也许mincore(2)msync(2)mlock(2)系统调用会让你感兴趣。

也许你想要mmap(2)MAP_POPULATE的orMAP_LOCKED标志

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

你也可能mmap有一些文件段。我相信在这种情况下没有可能的过度使用。但我只是建议禁用整个系统中的内存过度使用,通过/proc/sys/vm/overcommit_memory.

于 2012-12-11T06:07:37.403 回答