当我运行这段代码时,我得到了"mmap:操作不受支持“,根据mmap人,这是因为其中一个标志无效(由mmap人验证)“坏”标志是MAP_FIXED_NOREPLACE
#include <fcntl.h>
#include <errno.h>
#include <sys/mman.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char** argv)
{
int fd_addr = open("test", O_CREAT | O_RDWR);
if (fd_addr == -1) {
std::cout << "open: " << strerror(errno) << "\n";
return EXIT_FAILURE;
}
if (ftruncate(fd_addr, 100) == -1) {
std::cout << "ftruncate: " << strerror(errno) << "\n";
return EXIT_FAILURE;
}
auto mem =mmap((void*)0x7f4b1618a000, 1, PROT_READ | PROT_WRITE, MAP_FIXED_NOREPLACE | MAP_SHARED_VALIDATE | MAP_LOCKED, fd_addr, 0);
if (mem == MAP_FAILED) {
std::cout << "mmap: " << strerror(errno) << "\n";
return EXIT_FAILURE;
}
}有没有理智的想法,那会是什么,如何找出问题所在?我使用Ubuntu 20 (内核5.4.0-131-泛型)和g++-11 (与glibc 2.31)。
g++-11 (Ubuntu 11.1.0-1ubuntu1~20.04) 11.1.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
ldd (Ubuntu GLIBC 2.31-0ubuntu9.9) 2.31
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.将MAP_FIXED_NOREPLACE替换为MAP_FIXED运行得很好。这样编撰:
g++-11 -g0 -Ofast -DNDEBUG -Wall -Werror --std=c++2a -march=native -flto -fno-rtti main.cpp -pthread -lrt发布于 2022-10-28 08:04:07
要回答你的问题,唯一的办法就是看看你的来源。摘录自mmap
switch (flags & MAP_TYPE) {
case MAP_SHARED:
/*
* Force use of MAP_SHARED_VALIDATE with non-legacy
* flags. E.g. MAP_SYNC is dangerous to use with
* MAP_SHARED as you don't know which consistency model
* you will get. We silently ignore unsupported flags
* with MAP_SHARED to preserve backward compatibility.
*/
flags &= LEGACY_MAP_MASK;
fallthrough;
case MAP_SHARED_VALIDATE:
if (flags & ~flags_mask)
return -EOPNOTSUPP;将您的flags与LEGACY_MAP_MASK中的操作进行比较,很明显,MAP_FIXED_NOREPLACE不是LEGACY_MAP_MASK的一部分,后者返回您报告的“不支持的操作”错误。
在这种情况下,MAP_FIXED_NOREPLACE位会产生一个前部额外检查,并以MAP_FIXED的形式运行。
长话短说:在这种情况下,您可以在不失去功能的情况下用MAP_SHARED_VALIDATE替换MAP_SHARED。
执行您建议的操作(MAP_FIXED_NOREPLACE到MAP_FIXED)可能会意外地创建重叠内存映射。
https://stackoverflow.com/questions/74227764
复制相似问题