Rosetta 2 fonctionne en effectuant une traduction anticipée (AOT) du code Intel en code ARM correspondant. Il est capable de le faire efficacement et facilement, principalement parce que le CPU M1 contient une instruction spéciale qui commute le modèle d'ordonnancement de la mémoire observé par le CPU pour ce thread en un modèle équivalent au modèle Intel x86 (TSO - total store order). Ceci est lié à la manière dont les programmes peuvent s'attendre à ce que la cohérence de la mémoire fonctionne lorsqu'il y a plusieurs processeurs (c'est-à-dire des cœurs dans ce cas).
Les utilisateurs peuvent observer la traduction la première fois qu'ils lancent une application Intel sur le M1, car le premier lancement est lent. Le code traduit est mis en cache et utilisé lors des lancements suivants, beaucoup plus rapides.
Si vous avez un binaire valable pour plusieurs architectures différentes, vous pouvez invoquer spécifiquement Rosetta 2 en spécifiant que vous voulez lancer le code Intel. Vous pouvez le faire à partir du terminal comme ceci :
arch -x86_64 ./mycommand
Notez que ce paramètre s'applique également à tout programme que le processus "mycommand" devrait choisir d'exécuter.
Rosetta 2, tel que livré par Apple dans MacOS Big Sur, n'est pas configuré pour invoquer dynamiquement la traduction d'une partie des instructions x86. Il est entièrement axé sur la traduction AOT de l'ensemble du binaire à l'avance. Il n'y a pas d'interface utilisateur pour traduire un petit ensemble d'instructions à la volée. Rosetta 2 comprend un moteur JIT qui permet de traduire des instructions à la volée (par exemple si vous exécutez un navigateur basé sur Intel avec un moteur JavaScript JIT) - il ne s'agit cependant pas d'un moteur JIT à usage général que vous pourriez utiliser à d'autres fins via une API ou similaire.
Si vous voulez le faire à des fins de recherche ou par "pur intérêt", il vous suffit de prendre les instructions que vous voulez traduire et de les ajouter à un simple shell d'application (essentiellement en les ajoutant à un simple programme C main()-seulement par exemple) et de l'exécuter. La version traduite et mise en cache du programme comprend alors les instructions traduites à des fins d'inspection.
Le cache est disponible dans ces dossiers :
/var/db/oah/
/System/Library/dyld/aot_shared_cache
Il n'y a pas de moyen immédiat de "relier" Rosetta 2 à QEMU pour permettre une virtualisation rapide des images Intel Docker. QEMU contient sa propre émulation Intel x86, vous pourriez donc l'utiliser pour exécuter des images Docker Intel sur le M1 sans impliquer Rosetta 2 du tout. Dans ce cas, "rapide" est une mesure très subjective.