2010-05-06 5 views
5

J'écris un JIT sur ARM Linux qui exécute un jeu d'instructions qui contient du code auto-modifiable. Le jeu d'instructions n'a aucune instruction de vidage de cache (similaire à x86 à cet égard).mprotect vide-t-il le cache d'instructions sur ARM Linux?

Si j'écris du code sur une page, puis que j'appelle mprotect sur cette page, est-ce suffisant pour invalider le cache d'instructions? Ou dois-je également utiliser le syscall cacheflush sur ces pages?

Répondre

0

Je crois que vous n'avez pas besoin de vider explicitement le cache.

Quel processeur est-ce? ARMv5? ARMv7?

+1

Hmm, je cible nominalement ARMv5. Selon le ARM ARM, vous devez vider le cache d'instructions dans le cas d'un code auto-modifiable. Je me demande simplement si mprotect le fera pour moi. –

3

Vous vous attendez à ce que les appels système mmap/mprotect établissent des mappages mis à jour immédiatement et ne nécessitent aucune autre interaction pour utiliser les plages de mémoire spécifiées. Je vois que le noyau vide les caches sur mprotect. Dans ce cas, aucun vidage de cache ne serait requis.

Cependant, je vois aussi que certaines versions de libc n'appellent cacheflush après mprotect, ce qui impliquerait que certains environnements auraient besoin les caches vidées (ou ont déjà). Je suppose que c'est une solution à un bogue.

Vous pouvez toujours ajouter l'appel à cacheflush; Bien que ce soit du code supplémentaire, il ne devrait pas être dangereux - au pire, les caches seront déjà vidés. Vous pouvez toujours écrire un test rapide et voir ce qui se passe ...

Questions connexes