代码之家  ›  专栏  ›  技术社区  ›  n-alexander

直接IO的MMAP:地址错误?

  •  1
  • n-alexander  · 技术社区  · 16 年前

    我用匿名mmap分配了一些内存:

    buff->addr = mmap(NULL, length, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS -1, 0);
    fprintf(stderr, "allocated buffer: %p, %lu\n", buff->addr, (unsigned long)length);
    

    然后我用直接打开的fd给它写信:

    int fd = open(name, O_CREAT | O_TRUNC | O_WRONLY | O_DIRECT, 00300);
    if(fd == -1)
    {
        perror("failed to open for write");
        return;
    }
    
    fprintf(stderr, "writing to address: %p size: %lu\n", buff.addr, buff.length);
    if(write(fd, buff.addr, buff.length) != size)
    {
        perror("failed to write");
    }
    

    但地址错误:

    allocated buffer: 0x7f096ddff000, 512000
    writing to address: 0x7f096ddff000 size: 512000
    failed to write: Bad address
    

    我觉得这个地址不错。

    如果我在.data中分配缓冲区并与512对齐,那么写操作就可以了,所以open()和write()都可以,我拥有所有的权限等等。

    怎么了?直接IO除了512校准还有其他要求吗?

    更新:

    例如,如果我为此更改mmap:

    char buffer[ 1024000 ];
    for(buff->addr = buffer; ((unsigned long)buff->addr % 512) != 0; buff->addr = buff->addr + 1);
    

    它的工作原理是:

    allocated buffer: 0x500e00, 512000
    writing to address: 0x500e00 size: 512000
    
    1 回复  |  直到 14 年前
        1
  •  3
  •   nos    16 年前

    Prot_无页面不能 访问。

    你不应该至少把保护读作3。对mmap的争论?为了在这种情况下有用,您可能需要prot_read_prot_write

    推荐文章