gpt4 book ai didi

c - mmap() 拥有内存块

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:00:24 25 4
gpt4 key购买 nike

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

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

我知道要真正拥有内存,我需要访问那 block 内存。我想添加某种 0 或空字符串来实际拥有内存。我该怎么做?我尝试了以下方法,但这显然是段错误(我知道为什么会这样):

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

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

谢谢!

最佳答案

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

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

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

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

关于c - mmap() 拥有内存块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13814111/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com