通过mmap分配到/从缓冲区的直接磁盘IO分配
问题描述:
我需要有关直接磁盘IO的帮助。我用标记为O_DIRECT的文件描述符(fd)打开一个文件。在我的用户空间应用程序中,我想从文件中读取大量数据,并且这些数据仅用于一次。一块未缓存的内存缓冲区通过“set_memory_uc”(使用x86)在我的内核模块中分配,而“remap_pfn_range”与vm_page_prot设置为非缓存(pgrot_noncached)。此缓冲区旨在用于通过PCIe进行DMA传输。通过mmap分配到/从缓冲区的直接磁盘IO分配
我试图
读(FD,缓冲液,LEN)
和
lseek的(FD,为0x1000,SEEK_SET)
'缓冲' VA被对准到4K边界。因此,没有 'len个'(N * 4K)
的莫名其妙,“lseek'seems可行的,因为打完电话后lseek的返回×1000
但 '读' 返回-1
是否有任何限制直接磁盘读取磁盘数据到mmap缓冲区?
+1 this。开始使用'O_DIRECT'几乎总是一个错误。可能有合理的用途,但我真的无法想象一个有利的案例(实际上,而不是某人的想象)。唯一可争论的“优点”是在写作时更多的数据安全性,但这是一种幻想。除此之外,它不会更快,但通常比缓存读取慢很多。 – Damon
谢谢你回答我的问题。我对“posix_fadvise()”的问题是磁盘读取性能。 “O_DIRECT”和“posix_fadvise()”之间的数据流路径是否不同?使用“O_DIRECT”数据的图像被绕过OS缓冲区和缓存并直接转移到物理内存以供磁盘读取。但是“posix_fadvise()”仍然通过OS缓冲区和缓存。 –
@SharonLee:看到这里:https://unix.stackexchange.com/questions/6467/use-of-o-direct-on-linux - 你相信'O_DIRECT'会更快,但它可能不会。 –