2017-09-06 62 views
0

我需要有關直接磁盤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

而不是O_DIRECT,請考慮posix_fadvise()POSIX_FADV_NOREUSE標誌來指示「數據將只使用一次。」

+1

+1 this。開始使用'O_DIRECT'幾乎總是一個錯誤。可能有合理的用途,但我真的無法想象一個有利的案例(實際上,而不是某人的想象)。唯一可爭論的「優點」是在寫作時更多的數據安全性,但這是一種幻想。除此之外,它不會更快,但通常比緩存讀取慢很多。 – Damon

+0

謝謝你回答我的問題。我對「posix_fadvise()」的問題是磁盤讀取性能。 「O_DIRECT」和「posix_fadvise()」之間的數據流路徑是否不同?使用「O_DIRECT」數據的圖像被繞過OS緩衝區和緩存並直接轉移到物理內存以供磁盤讀取。但是「posix_fadvise()」仍然通過OS緩衝區和緩存。 –

+0

@SharonLee:看到這裏:https://unix.stackexchange.com/questions/6467/use-of-o-direct-on-linux - 你相信'O_DIRECT'會更快,但它可能不會。 –