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后代码正常运行,进一步证明是新标志不被低版本内核支持,而非代码逻辑错误。
解决方法
- 升级内核版本:将系统内核升级到5.10或更高版本,即可原生支持
MAP_FIXED_NOREPLACE和MAP_SHARED_VALIDATE标志,保留新标志的安全特性(MAP_FIXED_NOREPLACE不会覆盖现有映射,更安全)。 - 降级使用兼容标志:若无法升级内核,继续使用
MAP_FIXED替代,但需注意MAP_FIXED会直接覆盖目标地址的现有映射,使用前需通过mincore等工具检查目标地址是否已被映射,避免数据丢失或程序崩溃。
内容的提问来源于stack exchange,提问作者Dmitry
相关产品推荐
相关产品推荐

