内存未通过mmap中的MAP_ANONYMOUS和MAP_SHARED_VALIDATE标志分配

问题描述

我正在尝试分配带有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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...