Rosetta 2 funciona realizando una traducción anticipada (AOT) del código Intel al código ARM correspondiente. Es capaz de hacer esto de manera eficiente y fácil principalmente porque la CPU M1 contiene una instrucción especial que cambia el modelo de ordenamiento de memoria observado por la CPU para ese hilo a un modelo equivalente al modelo x86 de Intel (TSO - orden de almacenamiento total). Esto tiene que ver con la forma en que los programas pueden esperar que la consistencia de la memoria funcione cuando se tienen múltiples procesadores (es decir, núcleos en este caso).
Los usuarios pueden observar la traducción la primera vez que lanzan una aplicación de Intel en el M1, ya que el primer lanzamiento es lento. El código traducido se almacena en caché y se utiliza en los siguientes lanzamientos, mucho más rápidos.
Si tiene un binario válido para varias arquitecturas diferentes, puede invocar específicamente Rosetta 2 especificando que desea lanzar el código Intel. Puedes hacerlo desde el terminal así:
arch -x86_64 ./mycommand
Tenga en cuenta que esta configuración también se aplica a cualquier programa que el proceso "mycommand" decida ejecutar.
Rosetta 2, tal y como lo entrega Apple en MacOS Big Sur, no está configurado para invocar dinámicamente la traducción de una parte de las instrucciones x86. Se centra por completo en hacer una traducción AOT de todo el binario por adelantado. No hay una interfaz de usuario para traducir un pequeño conjunto de instrucciones sobre la marcha. Rosetta 2 incluye un motor JIT que permite traducir instrucciones sobre la marcha (por ejemplo, si se ejecuta un navegador basado en Intel con un motor JIT de JavaScript); sin embargo, no es un motor JIT de propósito general que se pueda utilizar para otros fines a través de una API o similar.
Si quieres hacerlo con fines de investigación o simplemente por "puro interés", entonces podrías simplemente tomar las instrucciones que quieres traducir y añadirlas a un simple shell de aplicación (esencialmente añadiéndolas a un simple programa main()-sólo en C, por ejemplo) y ejecutarlo. La versión traducida y almacenada en caché del programa incluye entonces las instrucciones traducidas para su inspección.
El caché está disponible en:
/System/Library/dyld/aot_shared_cache
No hay una forma inmediata de "puentear" Rosetta 2 con QEMU para permitir la virtualización rápida de imágenes Intel Docker. QEMU contiene su propia emulación Intel x86, por lo que se podría conseguir que ejecutara imágenes Intel Docker en la M1 sin involucrar a Rosetta 2 en absoluto. En este caso, "rápido" es una medida muy subjetiva.