2013-05-17 63 views
0

我使用Ubuntu在x86系統上12.10 32位。我有物理內存(大約32MB,有時更多),它是通過ACPI表作爲設備枚舉和保留的,以便linux/OS不能使用它。我有這個存儲設備的Linux驅動程序。驅動程序實現mmap(),以便在進程調用mmap()時,驅動程序可以將此保留的物理內存映射到用戶空間。我有時也無可奈何的MMAP除了設置了VMA的,並與實施的打開關閉和故障的功能vm_operations_struct點的vma-> vmops。當應用程序訪問mmapped內存時,出現頁面錯誤,並調用我的.fault函數。這裏是使用vm_insert_pfn將虛擬地址映射到我想要的32MB中的任何物理地址。爲什麼我不使用ioremap_cache時會設置PCD位?

這裏是我有問題:在驅動程序,如果我初始化期間調用ioremap_cache(),我得到了良好的應用緩存性能,當我在這個內存訪問數據。但是,如果我不調用ioremap_cache(),則會發現對這些物理頁面的任何訪問都會導致緩存未命中並導致可怕的性能。我查看了PTE,看到這些虛擬地址 - >物理轉換的PCD位已設置,這意味着禁用這些物理頁面上的緩存。我們試圖在vma_page_prot字段設置_PAGE_CACHE_WB也使用remap_pfn_range新vma_page_prot但PCD位在PTE的仍設置。

有誰對我們如何才能確保緩存這個內存啓用任何想法?我不想爲32 MB使用ioremap_cache()的原因是因爲32位系統上的內核虛擬地址有限,我不想保留它們。

+0

哦!我也想要一個解決方案,因爲我似乎無法成功超過32 MB的物理內存ioremap_cache()。 – Raghu

回答

0

建議:

  1. 閱讀linux/Documentation/x86/pat.txt
  2. 啓動Linux debugpat
  3. 嘗試set_memory_wb(後)的API,檢查/SYS /內核/調試/ 86/pat_memtype_list
+0

謝謝斯科特。我確實發現了這一點,我試圖set_memory_wb(),但它似乎沒有工作。我反正通過調用vm_insert_pfn()等函數調用ioremap_cache()和iounmap()來解決它。我問了一些問題,它看起來像這些函數調用register_memtype(),它繼續並設置PCD位並註冊在PAT列表。沒有其他導出的功能,驅動程序可以調用PCD位來設置請求。由於這是一個32位的問題,我們如上所述解決了這個問題。 – Raghu

相關問題