15 votes

Comment fonctionne Rosetta 2 ?

J'aimerais comprendre davantage le fonctionnement de Rosetta 2. Le site Article de Apple Developer est bref. Quelqu'un a-t-il fait une analyse approfondie du fonctionnement de Rosetta 2, de la manière dont il est invoqué et de la possibilité de l'utiliser via une API ?

Quelques questions :

  • Comment les applications x86_64 sont-elles lancées sous Rosetta ?
  • Est-il possible d'invoquer dynamiquement la traduction pour une partie des instructions x86 ?
  • Serait-il possible de relier Rosetta à QEMU ou à un système similaire pour permettre une virtualisation rapide des images Docker Intel ?

19voto

Jose Chavez Points 645

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.

8voto

Ko Nakagawa Points 71

Il s'agit d'une réponse pour une analyse approfondie du fonctionnement de Rosetta 2.

J'ai fait un peu de rétro-ingénierie sur Rosetta 2. Pour plus de détails, voir les pages GitHub de ce projet .

Les fichiers cache de Rosetta 2 sont situés aux deux endroits suivants /System/Library/dyld/aot_shared_cache y /var/db/oah/ .

/System/Library/dyld/aot_shared_cache contient uniquement les résultats traduits pour les dylibs du système (par ex, /usr/lib/system/libsystem_blocks.dylib , /usr/lib/system/libxpc.dylib Vous pouvez consulter la liste complète ici pour MacOS Big Sur version 11.1). Ce fichier contient plusieurs fichiers de cache pour System dylibs, sa taille est donc énorme.

Pour les binaires non-système, tels que les binaires x86_64 de tiers, les fichiers avec l'extension aot sous /var/db/oah contiennent les résultats traduits.

aot_shared_cache est un (gros) fichier, y a-t-il des outils disponibles pour extraire un contenu spécifique ?

@nohillside J'ai créé un simple script Python pour afficher le contenu de aot_shared_cache . Vous pouvez utiliser ce script pour extraire un contenu spécifique.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X