2012-02-09 56 views
7

我想從一個用戶空間進程中將一系列內存設置爲不可緩存(Linux,x86-86)。 This question接近,但只提到MTRR寄存器與物理內存一起工作。我想用PAT表來做這件事,因爲它們提供了更細緻的控制,它們允許虛擬內存在逐頁的基礎上被設置爲不可緩存的。將內存設置爲通過x86 PAT不可緩存表格

Linux文檔Documentation/x86/pat.txt建議應該有mmapSYNC標誌,但我找不到在實踐中如何做到這一點。理想情況下,我想使用諸如mprotect(address, range, O_UNCACHABLE)之類的電話。

+0

'madvise' /'mlock'是否足夠? – 2012-09-23 05:37:20

+0

不,它看起來像隻影響虛擬映射(不管頁面是在RAM還是在磁盤上),但它們似乎不會影響緩存... – Wim 2012-09-25 13:17:46

+0

是的,我誤解了。 :( – 2012-09-26 03:25:25

回答

2

我會建議編寫一個內核模塊爲用戶級進程提供必要的接口。在內核模塊內部,您可以使用set_memory_uc來控制頁面屬性。

關於模擬器:它應該慢10到幾千倍,而不是一百萬次,除非你在門級進行模擬。不要忘記考慮編寫內核模塊的時間。如果需要幾個星期來編寫和調試模塊,則最好使用模擬器進行一次實驗。

0

根據在ARM平臺上的各種開發問題的代碼如下:

fd = open("/dev/mem", O_RDWR|O_SYNC); 
uptr = mmap(addr, length, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_LOCKED, fd, off); 

裁判:

+0

有了這個代碼你可以訪問一個物理地址範圍,但你也必須保留它或以某種方式告訴內核不要使用它。如果你不壞事情會發生... – 2012-10-19 21:05:25