我正在ARM Linux上編寫JIT,它執行一個包含自修改代碼的指令集。該指令集沒有任何緩存刷新指令(在這方面與x86類似)。mprotect是否在ARM Linux上刷新指令緩存?
如果我向頁面寫出一些代碼,然後在該頁上調用mprotect
,是否足以使指令緩存失效?或者我還需要在這些頁面上使用cacheflush
系統調用?
我正在ARM Linux上編寫JIT,它執行一個包含自修改代碼的指令集。該指令集沒有任何緩存刷新指令(在這方面與x86類似)。mprotect是否在ARM Linux上刷新指令緩存?
如果我向頁面寫出一些代碼,然後在該頁上調用mprotect
,是否足以使指令緩存失效?或者我還需要在這些頁面上使用cacheflush
系統調用?
我相信你不必顯式刷新緩存。
這是哪種處理器? ARMv5中? ARMv7的?
您會希望mmap/mprotect系統調用會建立立即更新的映射,並且不需要進一步的交互來使用指定的內存區域。我看到內核的確在mprotect上清除緩存。在這種情況下,不需要緩存刷新。
然而,我也看到libc中的某些版本中做電cacheflush
mprotect
後,這將意味着某些環境可能需要刷新緩存(或有之前)。我猜測這是一個bug的解決方法。
您可以隨時將調用添加到cacheflush;雖然它是額外的代碼,但它不應該是有害的 - 最糟糕的是,緩存已經被刷新。你總是可以寫一個快速測試,看看會發生什麼...
嗯,我的目標是名義上的ARMv5。根據ARM ARM,在自修改代碼的情況下,您需要刷新指令緩存。我只是想知道mprotect是否會爲我做到這一點。 – 2010-05-06 02:54:35