mmap() 中的 MAP_ANONYMOUS 和 MAP_SHARED_VALIDATE 标志未分配内存
Memory does not get allocated with the MAP_ANONYMOUS and MAP_SHARED_VALIDATE flag in mmap()
我正在尝试分配带有 MAP_ANONYMOUS 标志的内存块,但它没有创建任何带有 MAP_SHARED_VALIDATE 标志的内存块,而是 MAP_ANONYMOUS 带有 MAP_PRIVATE 或MAP_SHARED 标志创建内存块。谁能解释一下为什么会这样。
#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
in linux/mm/mmap.c (kernel version 5.9), MAP_SHARED_VALIDATE
only seems to be supported for file-backed mappings (see the if (file)
and else
部分)。不知道是bug还是故意的
编辑:我已经提交了 bug report。
我正在尝试分配带有 MAP_ANONYMOUS 标志的内存块,但它没有创建任何带有 MAP_SHARED_VALIDATE 标志的内存块,而是 MAP_ANONYMOUS 带有 MAP_PRIVATE 或MAP_SHARED 标志创建内存块。谁能解释一下为什么会这样。
#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
in linux/mm/mmap.c (kernel version 5.9), MAP_SHARED_VALIDATE
only seems to be supported for file-backed mappings (see the if (file)
and else
部分)。不知道是bug还是故意的
编辑:我已经提交了 bug report。