【问题标题】:mmap for direct IO: bad address?直接 IO 的 mmap:地址错误?
【发布时间】:2010-08-23 18:27:37
【问题描述】:

我用匿名 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() 都可以,我拥有所有权限等

怎么了?除了 512 对齐之外,对于直接 IO 是否还有其他要求?

更新:

例如,如果我为此更改 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

【问题讨论】:

  • write() 是否返回非零值?
  • 您是否尝试写入某些硬件/外围设备?这就是直接 IO 的意思吗?
  • write 应该返回非零值,是的。这里它返回一个错误
  • 直接 IO 我的意思是 O_DIRECT。这是对普通文件的写入

标签: linux io mmap


【解决方案1】:

PROT_NONE 页面可能不会 访问。

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

【讨论】:

    猜你喜欢
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 2013-02-04
    • 2021-01-20
    相关资源
    最近更新 更多