2010-05-06 17 views
5

Ich schreibe ein JIT auf ARM Linux, das einen Befehlssatz ausführt, der selbst modifizierenden Code enthält. Der Befehlssatz hat keine Cache-Flush-Anweisungen (ähnlich wie x86 in dieser Hinsicht).Speichert mprotect den Befehls-Cache auf ARM Linux?

Wenn ich Code auf eine Seite schreibe und dann mprotect auf dieser Seite aufruft, reicht das aus, um den Befehlscache ungültig zu machen? Oder muss ich auch den Syscall auf diesen Seiten verwenden?

Antwort

0

Ich glaube, Sie müssen den Cache nicht explizit leeren.

Welcher Prozessor ist das? ARMv5? ARMv7?

+1

Hmm, ich ziele auf ARMv5 nominell. Laut ARM ARM müssen Sie den Anweisungscache bei selbst modifizierendem Code leeren. Ich frage mich nur, ob mprotect es für mich tun wird. –

3

Sie würden erwarten, dass die Systemaufrufe mmap/mprotect Mappings erstellen würden, die sofort aktualisiert werden und keine weiteren Interaktionen benötigen, um die angegebenen Speicherbereiche zu verwenden. Ich sehe, dass der Kernel in der Tat Caches auf mprotect löscht. In diesem Fall wäre kein Cache-Flush erforderlich.

jedoch, ich sehe auch, dass einige Versionen von libc rufen Sie cacheflush nach mprotect, was bedeuten würde, dass einige Umgebungen die Caches geleert benötigen würde (oder haben vorher). Ich nehme an, dass dies ein Workaround für einen Fehler ist.

Sie könnten den Aufruf immer zu cacheflush hinzufügen; obwohl es extra Code ist, sollte es nicht zu schädlich sein - im schlimmsten Fall werden die Caches bereits gespült. Du könntest immer einen schnellen Test schreiben und sehen, was passiert ...