为什么直接I / O需要对齐?

时间:2018-12-23 10:25:10

标签: linux memory io

man 2 read说:

  

EINVAL fd附加到不适合阅读的对象上;要么   使用O_DIRECT标志打开文件,然后选择其中一个地址   在buf中指定,在count中指定的值或当前文件   偏移量未正确对齐。

Non-direct I/O没有这样的限制,但是为什么直接I / O需要对齐?

1 个答案:

答案 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的内存相同,因此您的程序必须服从对齐,因为两者之间没有任何关系。解决问题。