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

Pau*_*aul 4 c unix linux mmap

我正在尝试使用 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;
}
Run Code Online (Sandbox Code Playgroud)

已经观察到在 Linux 4.19 和 Linux 5.8 上打印,

first: 0xffffffffffffffff Invalid argument
second: 0x7f56b274d000 Success
Run Code Online (Sandbox Code Playgroud)

这些标志似乎正在准确地传递给内核......

$ 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 +++
Run Code Online (Sandbox Code Playgroud)

Ian*_*ott 7

看着do_mmapLINUX /毫米/ mmap.c(内核版本5.9),MAP_SHARED_VALIDATE似乎只对文件支持的映射支持(见if (file)else区段)。我不知道这是一个错误还是故意的。

编辑:我已经提交了一个错误报告