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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:31:15