繁体   English   中英

mmap()拥有内存块

[英]mmap() owning memory block

我有一个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++;
}

通过在该区块中分配某些内容,我实际上将如何获得该区块的所有权?

谢谢!

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

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

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

最后,由于要设置页面PROT_READ ,因此实际上您将要从每个页面读取而不是尝试写入。

您提出的问题不是很好。 我不明白为什么您认为进程不拥有通过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_POPULATEMAP_LOCKED标志

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

您也可以mmap一些文件段。 我认为在这种情况下不会过度使用。 但是我只建议通过/proc/sys/vm/overcommit_memory禁用整个系统中的内存/proc/sys/vm/overcommit_memory

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM