问题描述
我正在尝试分配带有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,MAP_ANONYMOUS|MAP_SHARED,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,MAP_SHARED_VALIDATE|MAP_ANONYMOUS,0) = -1 EINVAL (Invalid argument)
mmap(NULL,MAP_SHARED|MAP_ANONYMOUS,0) = 0x7fd3145bb000
first: 0xffffffffffffffff Invalid argument
second: 0x7fd3145bb000 Success
+++ exited with 0 +++
解决方法
在do_mmap
(内核版本5.9)中,linux/mm/mmap.c似乎仅受文件支持的映射支持MAP_SHARED_VALIDATE
(请参见if (file)
和{{3} }部分)。我不知道这是错误还是故意的。
编辑:我已经提交了else
。