Linux 直接IO的mmap:地址错误?

Linux 直接IO的mmap:地址错误?,linux,io,mmap,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 |

我使用匿名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
PROT_NONE页面可能不可用 访问


难道你不应该至少让门卫读作3吗。mmap的参数?为了在这种情况下有用,您可能需要PROT_READ | PROT_WRITE

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