Mprotect очищает кэш инструкций в ARM Linux? - PullRequest
5 голосов
/ 06 мая 2010

Я пишу JIT на ARM Linux, который выполняет набор инструкций, который содержит самоизменяющийся код. В наборе команд нет инструкций очистки кэша (в этом отношении аналогично x86).

Если я напишу некоторый код на страницу и затем вызову mprotect на этой странице, достаточно ли этого для того, чтобы сделать кэш инструкций недействительным? Или мне также нужно использовать системный вызов cacheflush на этих страницах?

Ответы [ 2 ]

3 голосов
/ 14 февраля 2011

Вы ожидаете, что системные вызовы mmap / mprotect установят сопоставления, которые обновляются немедленно, и не требуют дальнейшего взаимодействия для использования диапазонов памяти, как указано.Я вижу, что ядро ​​действительно сбрасывает кеши на mprotect.В этом случае очистка кэша не требуется.

Однако , я также вижу, что некоторые версии libc вызывают cacheflush после mprotect, что подразумевает, что некоторые среды будутНужно, чтобы тайники сбрасывались (или были ранее).Я бы предположил, что это обход ошибки.

Вы всегда можете добавить вызов cacheflush;хотя это дополнительный код, он не должен быть вредным - в худшем случае кэши будут уже очищены.Вы всегда можете написать быстрый тест и посмотреть, что произойдет ...

0 голосов
/ 06 мая 2010

Полагаю, вам не нужно явно очищать кеш.

Какой это процессор? ARMv5? ARMv7

...