2010-05-06 50 views
5

我正在ARM Linux上編寫JIT,它執行一個包含自修改代碼的指令集。該指令集沒有任何緩存刷新指令(在這方面與x86類似)。mprotect是否在ARM Linux上刷新指令緩存?

如果我向頁面寫出一些代碼,然後在該頁上調用mprotect,是否足以使指令緩存失效?或者我還需要在這些頁面上使用cacheflush系統調用?

回答

0

我相信你不必顯式刷新緩存。

這是哪種處理器? ARMv5中? ARMv7的?

+1

嗯,我的目標是名義上的ARMv5。根據ARM ARM,在自修改代碼的情況下,您需要刷新指令緩存。我只是想知道mprotect是否會爲我做到這一點。 – 2010-05-06 02:54:35

3

您會希望mmap/mprotect系統調用會建立立即更新的映射,並且不需要進一步的交互來使用指定的內存區域。我看到內核的確在mprotect上清除緩存。在這種情況下,不需要緩存刷新。

然而,我也看到libc中的某些版本中做電cacheflushmprotect後,這將意味着某些環境可能需要刷新緩存(或有之前)。我猜測這是一個bug的解決方法。

您可以隨時將調用添加到cacheflush;雖然它是額外的代碼,但它不應該是有害的 - 最糟糕的是,緩存已經被刷新。你總是可以寫一個快速測試,看看會發生什麼...