2011-06-22 87 views
1

爲什麼不下面的僞代碼工作(O_DIRECT導致EFAULT)如何將mmap輸入內存寫入O_DIRECT輸出文件?

in_fd = open("/dev/mem"); 
in_mmap = mmap(in_fd); 
out_fd = open("/tmp/file", O_DIRECT); 
write(out_fd, in_mmap, PAGE_SIZE); 

而下列情況(無O_DIRECT)

in_fd = open("/dev/mem"); 
in_mmap = mmap(in_fd); 
out_fd = open("/tmp/file"); 
write(out_fd, in_mmap, PAGE_SIZE); 

我想這是一些與虛擬內核頁,以虛擬用戶頁面,在寫入調用中無法翻譯?

最好的問候,

弗里德里希

+0

'O_DIRECT'寫入需要釘住頁面;也許這就是問題......你究竟在做什麼?如果這是一個內存映射的硬件設備,那麼最好給驅動程序添加'splice'支持...另外,請提供一個更完整的示例(包括所有系統調用的所有標誌)。理想情況下,任何人都可以編譯並運行重現。 – Nemo

回答

0

使用mmap()與O_DIRECT是棘手的。有一些限制。輸出到文件應該是塊對齊的。例如,如果您將mmap()中的偏移量設置爲0,則您的代碼將起作用。您必須檢查文件系統的塊大小以正確設置該值。