2012-03-27 75 views
10

我寫了一個linux驅動程序,ioremaps將特定設備的PCI BAR0導出到允許用戶空間直接控制它的sysfs二進制屬性。如何防止MMAP緩存值?

當我試圖在屬性頂部的MMAP直接訪問該位內存(來自用戶級程序)時,問題就隨之增加。讀取成功就好,並返回期望的值,但是當我寫入該內存時,它似乎被緩存在內核和內存之間的某處,而不會傳遞到GMCH根聯合體(因此也就是設備)。我想要做的是每次訪問後都有一個隱式寫入內存屏障。

  • 有什麼辦法可以防止內核緩存寫入內存的mmap-ed位?

遵守了UPS:

  • 呼喚後,每msync()訪問 「接受」 的方式來做到這一點?
+1

要回答後續......你根本不需要'msync()',因爲沒有文件支持mmap。你可能需要的是一些體系結構特定的指令,例如爲了確保powerpc上硬件訪問的正確順序,你可能需要[eieio](https://www-01.ibm.com/support/knowledgecenter /ssw_aix_61/com.ibm.aix.alangref/idalangref_eieio_instrs.htm)指令(某人有幽默感:-) ...做出同樣的評論[這裏](https://unix.stackexchange.com/questions/237783/訪問存儲器映射-IO-是慢)。 – 2015-11-04 12:42:44

回答

19

打算繼續,用我的解決方案自己回答這個問題。

在我的sysfs mmap函數的內核驅動程序中,在/include/asm/pgtable.h中有一個宏,它爲nocache'd pfn remap設置了正確的標誌。它看起來像這樣:

vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); 
if (io_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, 
       vma->vm_end - vma->vm_start, 
       vma->vm_page_prot)) 
    return -EAGAIN; 

此外,在用戶級MMAP,我用了MAP_SHARED標誌的mmap的flags參數。

兩者的結合最終取得了成效。

+0

Thx這麼多人!我和你的問題完全一樣,也找不到解決辦法... – Julien 2012-06-06 14:29:49

+1

+1也爲我工作。感謝您花時間在此處發佈解決方案。 :-) – TheCodeArtist 2014-03-06 11:10:50

+0

謝謝你兄弟,這正是我一直在尋找的! – Luca 2015-01-28 12:06:17

0

可能ioremap_nocache()有幫助嗎?

+0

我正在使用io_remap_pfn_range重新映射並將內核頁面轉換爲用戶空間地址。 我看過(並正在使用)其他地方的ioremap_nocache(),並且手動設置每個頁面上的KERNEL_NOCACHE屬性。我找不到任何提及使用io_remap_pfn_range發生的事情(或設置標誌)。 – 2012-03-27 14:17:12

+1

附加說明:ioremap_nocache()幾乎用於將IO內存映射到內核空間而不是放入用戶空間 - 這就是爲什麼io_remap_pfn_range非常方便。 – 2012-03-27 14:53:54