我调用了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++;
}
如何通过在该块中分配内容来实际获得该块的所有权?
谢谢!
答案 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_POPULATE
或MAP_LOCKED
标志
我实际上不明白为什么你在你的问题中说“拥有记忆”,我不太了解。如果您只想禁用内存过量使用,请告诉。
您可能还mmap
了一些文件段。我相信在这种情况下不可能过度使用。但我建议通过/proc/sys/vm/overcommit_memory
来禁用整个系统中的内存过量使用。