Linux 直接IO的mmap:地址错误?
我使用匿名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 |
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_WRITEIs
WRITE()
返回非零值?您是否正在尝试写入某些硬件/外围设备?这就是直接IO的意思吗?write应该返回非零值,是的。在这里,它返回一个errorby direct IO,我的意思是O_direct。这是对普通文件的写入