EINVAL fd附加到不适合阅读的对象上;要么 使用O_DIRECT标志打开文件,然后选择其中一个地址 在buf中指定,在count中指定的值或当前文件 偏移量未正确对齐。
Non-direct I/O
没有这样的限制,但是为什么直接I / O需要对齐?
答案 0 :(得分:0)
(内核2.6+),这是因为从内核的角度来看,直接I / O 可以为零拷贝(即,数据本身的内核中不再进行复制),并且磁盘具有I / O的最小可寻址大小称为“逻辑块大小”(通常为512字节,但可能为4096字节甚至更多)。 O_DIRECT requirement (must obey logical block size alignments) is actually described in the man page for open()
(请参阅“注意”下的“ O_DIRECT
”部分)。
在有缓冲I / O的情况下,内核将数据从用户空间地址复制到其自己的内部页面缓存地址中(该地址遵守所有对齐规则,并在需要时执行“读取-修改-写入”以确保所有内容都对齐),然后告诉设备对页面缓存位置进行I / O操作。在直接I / O情况下,一切正常的情况下,分配给您的用户空间程序的内存与移交给设备进行I / O来回/从I / O的内存相同,因此您的程序必须服从对齐,因为两者之间没有任何关系。解决问题。