直接IO的mmap:坏地址?

时间:2010-08-23 18:27:37

标签: linux io mmap

我使用匿名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);

然后我使用用O_DIRECT打开的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 个答案:

答案 0 :(得分:3)

  

PROT_NONE页面可能不是   访问。

你不应该至少将PROT_READ作为mmap的3.参数吗?在这种情况下有用,你可能需要PROT_READ | PROT_WRITE

相关问题