애플 로제타 2가 빠른 이유가 무엇인지를 분석한 글입니다.
https://dougallj.wordpress.com/2022/11/09/why-is-rosetta-2-fast/
로제타 2는 인텔 x64 바이너리를 Arm 애플 실리콘에서 실행할 수 있도록 Arm 64비트 코드로 바꿔주는 컴파일 번역기입니다. 에뮬레이터가 아닙니다. 전체 바이너리를 한번만 번역해서 그걸 계속해서 활용합니다.
그래서 빠른 이유가 뭔지 이것저것 설명을 했는데, 가장 흥미로운 대목은 여기에서 자세히 설명하고 있습니다.
https://bytecellar.com/2022/11/16/a-secret-apple-silicon-extension-to-accommodate-an-intel-8080-artifact/
인텔이 1974년에 내놓은 두번째 프로세서인 인텔 808에서 조정과 패리티 플래그를 특별한 방법으로 처리해, 이진 코드로 십진법을 연산할 때 숫자를 전달할지를 표시했습니다. 이 방법은 현재의 앱에서 잘 쓰지 않지만 최근의 x64 칩까지 유지됐습니다.
Arm 아키텍처에는 이런 기능이 없기에 에뮬레이션 처리가 필요한데, 앞서 말한대로 로제타 2가 에뮬레이터가 아니기에 인텔 프로세서의 바이너리를 다시 컴파일해야 합니다. 그러나 조정/패리티 플래그를 쓸 것인지를 알 수 없으니 Arm 플래그 레지스트의 비트 26/27을 써서 이 처리를 맡깁니다.
이렇게 하는 건 Arm의 스펙에 맞지 않기에 로제타 2를 실행할 때만 이런 방식으로 작동합니다. 그래서 리눅스 가상 머신을 실행할 때는 이 기능이 작동하지 않는다고 합니다.