Ingeniería inversa de Rosetta 2: cómo funciona la 'traducción' de Apple

Fuentes: GitHub - Inokinoki/attesor: AI-powered reverse-engineering of Rosetta (2 for Linux)

Rosetta 2 es una pieza fundamental de la transición de Apple a sus propios chips ARM (Apple Silicon) desde los procesadores Intel x86_64. Para permitir que las aplicaciones existentes, compiladas para la arquitectura Intel, sigan funcionando en los nuevos Macs, Apple desarrolló Rosetta 2, un sofisticado sistema de traducción binaria dinámica. En esencia, Rosetta 2 actúa como un traductor en tiempo real, convirtiendo el código x86_64 a ARM64 sobre la marcha.

El primer Rosetta, utilizado entre 2006 y 2011 para la transición de PowerPC a Intel, ya traducía código dinámicamente, pero con una penalización de rendimiento del 20-50%. Rosetta 2 mejora significativamente este proceso. Su arquitectura se compone de tres capas principales: un 'Translator' (que realiza la traducción, utilizando tanto técnicas 'Ahead-of-Time' (AOT) para traducir el código una vez y almacenarlo en caché, como 'Just-in-Time' (JIT) para el código dinámico), una 'Runtime Library' (que proporciona soporte para funciones y bibliotecas necesarias) y un 'System Call Translator' (que adapta las llamadas al sistema operativo de x86_64 a sus equivalentes en ARM64).

La instalación de Rosetta 2 no es automática. El usuario puede ser notificado para instalarla al ejecutar una aplicación que lo requiera, o puede instalarse manualmente a través de la línea de comandos (softwareupdate --install-rosetta --agree-to-license). El código de Rosetta 2 reside principalmente en /Library/Apple/usr/libexec/oah/ y se organiza en binarios principales (rosetta, rosettad) y bibliotecas de runtime.

El proyecto 'Inokinoki/attesor' en GitHub es un esfuerzo de ingeniería inversa exhaustivo para comprender y documentar el funcionamiento interno de Rosetta 2. Este proyecto ha logrado identificar y documentar cientos de funciones, proporcionando implementaciones en C que facilitan la comprensión de la complejidad de la traducción binaria. Esto es valioso tanto para fines educativos como para la investigación y el desarrollo.

Existen limitaciones inherentes a la traducción binaria. Aunque Rosetta 2 ha optimizado el rendimiento, siempre habrá una sobrecarga en comparación con la ejecución de código nativo. Además, la traducción no es perfecta y puede haber casos en los que ciertas aplicaciones no funcionen correctamente o requieran modificaciones. Finalmente, es importante recordar que Rosetta 2 es una solución temporal; el objetivo final es que todas las aplicaciones estén compiladas para ARM64.