C 拥有内存块的mmap()

C 拥有内存块的mmap(),c,linux,unix,mmap,C,Linux,Unix,Mmap,我调用了mmap(),我尝试使用map\u ANONYMOUS映射64MB,如下所示: void *block = mmap(0, 67108864, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (block == MAP_FAILED) exit(1); 我明白,要真正拥有内存,我需要点击内存块。我想添加某种0或空字符串来实际拥有内存。我该怎么做?我尝试了以下方法,但这显然是错误的(我知道原因): char*temp=bloc

我调用了mmap(),我尝试使用
map\u 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;
对于(int i=0;i<67108864;i++){
*温度='0';
temp++;
}
我如何通过分配该块中的某些内容来获得该块的所有权


谢谢

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

您新的
mmap
-ed内存区域只有
PROT_READ
(因此您可以读取内部的零),您需要
PROT_READ | PROT_WRITE
才能在内部写入

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

如果进程具有pid 1234,则可以通过
/proc/1234/maps
顺序读取(可能在另一个终端中使用
cat/proc/1234/maps
)其内存映射;在流程内部,使用
/proc/self/maps

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

也许,系统调用会让您感兴趣

也许您希望的
MAP\u填充
MAP\u锁定
标志

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


您还可以
mmap
一些文件段。我相信在这种情况下不可能过度承诺。但是我建议您通过
/proc/sys/vm/overmit\u memory
禁用整个系统中的内存过度使用。您的问题没有很好地表达出来。我不明白为什么您认为进程没有拥有通过
mmap
获得的内存

您新的
mmap
-ed内存区域只有
PROT_READ
(因此您可以读取内部的零),您需要
PROT_READ | PROT_WRITE
才能在内部写入

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

如果进程具有pid 1234,则可以通过
/proc/1234/maps
顺序读取(可能在另一个终端中使用
cat/proc/1234/maps
)其内存映射;在流程内部,使用
/proc/self/maps

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

也许,系统调用会让您感兴趣

也许您希望的
MAP\u填充
MAP\u锁定
标志

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


您还可以
mmap
一些文件段。我相信在这种情况下不可能过度承诺。但是我建议您通过
/proc/sys/vm/overmit\u memory
禁用整个系统中的内存过度分配,您的进程已经拥有了内存,但我认为您需要的是让它驻留。也就是说,您希望内核为
mmap
ed区域分配物理内存

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

强制页面错误的最简单方法是像现在这样触摸内存。不过,由于页面大小几乎肯定是4096字节,因此实际上每4096字节只需读取一个字节,从而减少了实际需要做的工作量


最后,由于您正在设置页面
PROT_READ
,因此您实际上希望从每个页面读取而不是尝试写入。您的进程已经拥有内存,但我认为您希望的是使其驻留。也就是说,您希望内核为
mmap
ed区域分配物理内存

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

强制页面错误的最简单方法是像现在这样触摸内存。不过,由于页面大小几乎肯定是4096字节,因此实际上每4096字节只需读取一个字节,从而减少了实际需要做的工作量


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

拥有内存是什么意思?使用mmap后,它返回一个指针(您正在将其分配给块),然后您可以通过简单的基于指针的操作更改内存映射中的任何内容。您的第二个代码片段将在使用mmap得到的整个内存映射中填充零。当
mmap
失败时,您应该执行
{perror(“mmap”);exit(exit_faiorule);}
而不是只执行
exit(1)
。因为您需要了解为什么
mmap
调用失败。您好,您的意思是内存将
alloc on write
?它不会真正分配一个真正的内存块。并将推迟到你第一次写上它。所以你们想确保内存已经分配?你们的问题和内存过度分配有关吗?如果是,请明确地说!是什么让您认为该进程不拥有它通过mmap获得的内存区域
char *temp = block;
for (int i = 0; i < 67108864; i++) {
    *temp = '0';
    temp++;
}