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

问题描述 投票:0回答:1

man 2 read说:

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

man 2 read没有这样的限制,但是为什么直接I / O需要对齐?

linux memory io
1个回答
0
投票

(Kernel 2.6+),这是因为从内核的角度来看,直接I / O can是零拷贝的(即,数据本身的内核中不再进行复制),并且磁盘的最小可寻址大小为I / O被称为“逻辑块大小”(通常为512字节,但可能为4096字节甚至更多)。此Non-direct I/O(请参阅“注释”下的O_DIRECT requirement (must obey logical block size alignments) is actually described in the man page for open()部分)。

在有缓冲I / O的情况下,内核将数据从用户空间地址复制到其自己的内部页面缓存地址中(该地址遵守所有对齐规则,并在必要时进行读-修改-写操作,以确保所有内容都对齐),然后告诉设备对页面缓存位置进行I / O操作。在直接I / O情况下,如果一切正常,分配给您的用户空间程序的内存就是与设备之间进行I / O往返操作的内存,因此您的程序必须遵守对齐要求,因为两者之间没有任何关系。解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.