首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ubuntu 20不支持MAP_FIXED_NOREPLACE

Ubuntu 20不支持MAP_FIXED_NOREPLACE
EN

Stack Overflow用户
提问于 2022-10-27 20:08:04
回答 1查看 35关注 0票数 2

当我运行这段代码时,我得到了"mmap:操作不受支持“,根据mmap人,这是因为其中一个标志无效(由mmap人验证)“坏”标志是MAP_FIXED_NOREPLACE

代码语言:javascript
复制
#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)。

代码语言:javascript
复制
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运行得很好。这样编撰:

代码语言:javascript
复制
g++-11 -g0 -Ofast -DNDEBUG -Wall -Werror --std=c++2a -march=native -flto -fno-rtti main.cpp -pthread -lrt
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-28 08:04:07

要回答你的问题,唯一的办法就是看看你的来源。摘录自mmap

代码语言:javascript
复制
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;

将您的flagsLEGACY_MAP_MASK中的操作进行比较,很明显,MAP_FIXED_NOREPLACE不是LEGACY_MAP_MASK的一部分,后者返回您报告的“不支持的操作”错误。

在这种情况下,MAP_FIXED_NOREPLACE位会产生一个前部额外检查,并以MAP_FIXED的形式运行。

长话短说:在这种情况下,您可以在不失去功能的情况下用MAP_SHARED_VALIDATE替换MAP_SHARED

执行您建议的操作(MAP_FIXED_NOREPLACEMAP_FIXED)可能会意外地创建重叠内存映射。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74227764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档