Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 内存没有使用mmap()中的MAP_ANONYMOUS和MAP_SHARED_VALIDATE标志进行分配_C_Linux_Unix_Mmap - Fatal编程技术网

C 内存没有使用mmap()中的MAP_ANONYMOUS和MAP_SHARED_VALIDATE标志进行分配

C 内存没有使用mmap()中的MAP_ANONYMOUS和MAP_SHARED_VALIDATE标志进行分配,c,linux,unix,mmap,C,Linux,Unix,Mmap,我试图使用MAP_匿名标志分配内存块,但它不会创建任何带有MAP_共享_验证标志的内存块,而是使用MAP_私有或MAP_共享标志的MAP_匿名创建内存块。有人能解释一下为什么会这样吗 #包括 #包括 #包括 #包括 #包括 内部主(空) { size_t size=getpagesize(); errno=0; void*first=mmap(0,大小,保护读取,保护写入, MAP_匿名| MAP_共享_验证,-1,0); printf(“第一个:%p%s\n”,第一个,strerror(err

我试图使用MAP_匿名标志分配内存块,但它不会创建任何带有MAP_共享_验证标志的内存块,而是使用MAP_私有或MAP_共享标志的MAP_匿名创建内存块。有人能解释一下为什么会这样吗

#包括
#包括
#包括
#包括
#包括
内部主(空)
{
size_t size=getpagesize();
errno=0;
void*first=mmap(0,大小,保护读取,保护写入,
MAP_匿名| MAP_共享_验证,-1,0);
printf(“第一个:%p%s\n”,第一个,strerror(errno));
errno=0;
void*second=mmap(0,大小,保护读取,保护写入,
MAP|u匿名| MAP|u共享,-1,0);
printf(“第二个:%p%s\n”,第二个,strerror(errno));
返回0;
}
已观察到在Linux 4.19和Linux 5.8上打印

first:0xFFFFFFFFFFFFFF无效参数
第二个:0x7f56b274d000成功
这些标志似乎被准确地传递给内核

$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(无效参数)
mmap(NULL,4096,保护读取|保护写入,映射共享|映射匿名,-1,0)=0x7fd3145bb000
第一个:0xFFFFFFFFFFFFFF无效参数
第二:0x7fd3145bb000成功
+++以0退出+++
查看(内核版本5.9),
MAP\u SHARED\u VALIDATE似乎只支持文件备份映射(请参阅和部分)。我不知道这是一个bug还是故意的


编辑:我已经提交了一个。

在您的代码示例中,mmap调用之间没有区别(但是我不确定您想用2个调用展示什么)。另外,您的
printf
调用访问越界内存,因为您没有为
%p
格式提供参数。如果
mmap
返回
-1
,您应该查看
errno
并查看第一个错误是什么。请注意,对
mmap
的第二次调用可能会更改
errno
的值,因此您需要在每次
mmap
调用后立即查看它,例如:
uint8_t*first=mmap(…);printf(“第一个:%p%s\n”,(void*)第一个,strerror(errno))(重复第二次)。我可以在Linux 5.8上重现报告的行为(
mmap
失败,而不是segfault),我完全不知道为什么<代码>错误号
EINVAL
。从手册页上我可以看出,
MAP\u SHARED\u VALIDATE\MAP\u ANONYMOUS
应该是一个有效的标志组合。您的内核是否支持
MAP\u SHARED\u VALIDATE
?手册页上写着“自Linux4.15以来”。@AndrewHenle编辑成了问题。这似乎是一个bug。当然,手册页没有给出这种行为的任何提示。@NateEldredge我还是提交了一份错误报告。:)