C程序mmap /dev/dax0.0持久化内存遇无效参数错误求助
解决devdax模式下Intel DCPMM内存mmap失败(Invalid argument)的问题
针对你遇到的mmap: Invalid argument错误,核心原因是devdax设备对mmap的长度和偏移量有严格的对齐要求,以下是具体的解决步骤:
1. 确认设备的对齐粒度
devdax设备要求映射的长度和偏移量必须对齐到其自身的粒度值,这个值可以通过ndctl工具查看:
ndctl list -N | grep -E 'dev|align'
输出示例(对齐粒度为2MB):
dev:/dev/dax0.0
align: 2097152
记录这个align对应的数值(单位字节),后续代码需要用到。
2. 调整mmap参数以满足对齐要求
你的代码中映射长度为4KB(1<<12字节),远小于大多数devdax设备的默认对齐粒度(通常2MB),这是导致错误的直接原因。修改代码如下:
#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <sys/mman.h> #include <unistd.h> // 替换为第一步查到的对齐粒度值,示例为2MB #define DEVDAX_ALIGN (2 * 1024 * 1024) int main(int argc, char* argv[]){ int fd = open("/dev/dax0.0", O_RDWR); if(fd < 0){ perror("open"); exit(EXIT_FAILURE); } printf("fd: %d\n", fd); // 长度必须是对齐粒度的整数倍,偏移量0已符合要求 char *ptr = (char *)mmap(NULL, DEVDAX_ALIGN, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if(ptr == MAP_FAILED){ perror("mmap"); close(fd); exit(EXIT_FAILURE); } // 测试持久化读写 ptr[0] = 'X'; printf("写入持久化内存内容: %c\n", ptr[0]); munmap(ptr, DEVDAX_ALIGN); close(fd); return EXIT_SUCCESS; }
3. 额外排查点
- 权限问题:确保当前用户拥有
/dev/dax0.0的读写权限,或使用sudo运行程序 - 设备模式验证:通过
ndctl list -N确认设备的mode字段为devdax - 内核版本:devdax需要Linux 4.14及以上版本的内核支持,建议使用稳定版内核
- 文件描述符生命周期:避免在
mmap后立即关闭文件描述符,最好在munmap完成后再关闭
内容的提问来源于stack exchange,提问作者Arun Kp
相关产品推荐
相关产品推荐

