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