You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 20下MAP_FIXED_NOREPLACE不支持问题排查求助

关于mmap使用MAP_FIXED_NOREPLACE标志报错的问题排查与解决

运行带有MAP_FIXED_NOREPLACE标志的mmap代码时,出现mmap: Operation not supported错误。根据mmap手册,该错误由无效标志导致(经MAP_SHARED_VALIDATE验证),问题指向MAP_FIXED_NOREPLACE标志。将MAP_FIXED_NOREPLACE替换为MAP_FIXED后代码可正常运行。

问题代码

#include <fcntl.h>
#include <errno.h>
#include <sys/mman.h>
#include <string.h>
#include <unistd.h>
#include <iostream>
#include <cstdlib>

int main(int argc, char** argv)
{
    int fd_addr = open("test", O_CREAT | O_RDWR, 0644); // 补充权限参数,避免open隐含问题
    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;
    }
    close(fd_addr); // 补充关闭文件描述符,避免资源泄漏
    return EXIT_SUCCESS;
}

环境与编译命令

  • 系统环境:Ubuntu 20(内核5.4.0-131-generic)
  • 编译工具:g++-11(glibc 2.31)
  • 编译命令:
g++-11 -g0 -Ofast -DNDEBUG -Wall -Werror --std=c++2a -march=native -flto -fno-rtti main.cpp -pthread -lrt

排查思路与解决方法

  • 内核版本兼容性问题:MAP_FIXED_NOREPLACE和MAP_SHARED_VALIDATE都是Linux 5.10版本才新增的mmap标志,你的内核版本为5.4.0,低于最低支持版本,内核无法识别这些标志,因此返回"Operation not supported"错误。
  • 验证标志有效性:替换MAP_FIXED_NOREPLACE为MAP_FIXED后代码正常运行,进一步证明是新标志不被低版本内核支持,而非代码逻辑错误。

解决方法

  1. 升级内核版本:将系统内核升级到5.10或更高版本,即可原生支持MAP_FIXED_NOREPLACE和MAP_SHARED_VALIDATE标志,保留新标志的安全特性(MAP_FIXED_NOREPLACE不会覆盖现有映射,更安全)。
  2. 降级使用兼容标志:若无法升级内核,继续使用MAP_FIXED替代,但需注意MAP_FIXED会直接覆盖目标地址的现有映射,使用前需通过mincore等工具检查目标地址是否已被映射,避免数据丢失或程序崩溃。

内容的提问来源于stack exchange,提问作者Dmitry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 17:20:30