gpt4 book ai didi

c - mmap() 中的 MAP_ANONYMOUS 和 MAP_SHARED_VALIDATE 标志未分配内存

转载 作者:行者123 更新时间:2023-12-03 09:46:47 26 4
gpt4 key购买 nike

我正在尝试使用 MAP_ANONYMOUS 标志分配内存块,但它没有与 MAP_SHARED_VALIDATE 标志一起创建任何内存块,但带有 MAP_PRIVATE 或 MAP_SHARED 标志的 MAP_ANONYMOUS 会创建内存块。有人可以解释为什么会这样。

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/mman.h>
#include <unistd.h>

int main(void)
{
size_t size = getpagesize();

errno = 0;
void *first = mmap(0, size, PROT_READ|PROT_WRITE,
MAP_ANONYMOUS|MAP_SHARED_VALIDATE, -1, 0);
printf("first: %p %s\n", first, strerror(errno));

errno = 0;
void *second = mmap(0, size, PROT_READ|PROT_WRITE,
MAP_ANONYMOUS|MAP_SHARED, -1, 0);
printf("second: %p %s\n", second, strerror(errno));

return 0;
}
已观察到在 Linux 4.19 和 Linux 5.8 上都可以打印,
first: 0xffffffffffffffff Invalid argument
second: 0x7f56b274d000 Success
这些标志似乎正在准确地传递给内核......
$ strace -e trace=mmap ./a.out 2>&1 | tail -n5
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED_VALIDATE|MAP_ANONYMOUS, -1, 0) = -1 EINVAL (Invalid argument)
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0) = 0x7fd3145bb000
first: 0xffffffffffffffff Invalid argument
second: 0x7fd3145bb000 Success
+++ exited with 0 +++

最佳答案

do_mmap linux/mm/mmap.c (内核版本 5.9),MAP_SHARED_VALIDATE似乎只支持文件支持的映射(参见 if (file) else 部分)。我不知道这是一个错误还是故意的。
编辑:我已经提交了 bug report .

关于c - mmap() 中的 MAP_ANONYMOUS 和 MAP_SHARED_VALIDATE 标志未分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64354124/

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