Возможно ли, чтобы другие эмуляторы x86-64 на M1 использовали те же оптимизации, что и Rosetta 2?

#assembly #emulation #arm64 #apple-silicon #rosetta-2

Вопрос:

Мне любопытны совершенно разные характеристики производительности при запуске двоичных файлов x86-64 на платформе Apple M1 с использованием Rosetta 2 и эмуляции, например, то, что в настоящее время делает Docker Desktop с использованием QEMU.

Я понимаю, почему эмуляция происходит так медленно, но объяснение того, почему Rosetta 2 работает так быстро, было подробно описано в этой теме Twitter: https://twitter.com/ErrataRob/status/1331735383193903104

Суть этого объяснения заключается в том, что при обычных обстоятельствах arm и x86 имеют противоположные (и несовместимые) схемы адресации памяти, которые требуют значительных затрат на эмуляцию, но чип M1 решает эту проблему с помощью аппаратной оптимизации, которая позволяет ему получать доступ к памяти с использованием обеих схем адресации. Фактически, когда выполняются инструкции, эмулируемые Rosetta 2, устанавливается флаг, сообщающий процессору об использовании схемы адресации в стиле x86.

Предполагая, что это объяснение является разумным (и если у кого есть лучше-источников информации, чем выше в Twitter-нить буду признателен этом в комментариях для включения), это технически допустимо, что эта оптимизация может быть использована для полной аппаратной эмуляции, например, работает на x86-64 Linux и Docker-контейнеров, или работает на x86-64 для рабочего стола Windows виртуальные машины а-ля компания VMware фьюжн/в VirtualBox? Или отдельный уровень операционной системы в этих сценариях исключает возможность использования оптимизации упорядочения памяти?

Отдельно задокументирован и опубликован ли этот режим процессора (флаги или инструкции) для стороннего использования или он является частным только для Apple?

Ответ №1:

Не адресация памяти, а упорядочение памяти. т. е. для атомов без блокировки, используемых для синхронизации между потоками-в x86 каждая загрузка/хранилище asm соответственно приобретается/освобождается. (С реальными процессорами x86, выполняющими спекулятивные ранние загрузки, чтобы производительность не снижалась в обычных условиях, когда один поток работает с памятью, которую не записывают другие потоки.)

M1 имеет аппаратную поддержку для такого режима, а также слабо упорядоченный режим для наиболее эффективного выполнения собственного кода AArch64. Видеть

И да, https://github.com/saagarjha/TSOEnabler является программным обеспечением с открытым исходным кодом для переключения этой поддержки. Но это расширение ядра, и подпись кода затрудняет разрешение macOS, и вам нужно подписать его или отключить проверку подписи или что-то в этом роде:

Предположительно, вы сможете использовать это, если создадите и подпишете расширение ядра (отключив SIP, если вы не используете сертификат подписи KEXT) и перетащите его в /Библиотека/Расширения. Должно появиться диалоговое окно с предложением включить расширение в области настроек безопасности и конфиденциальности, вы разрешаете его оттуда и перезапускаете, и оно будет установлено. (Если вы этого не видите, разрешения для расширения могут быть неверными: попробуйте использовать колесо chown-R root:.) На практике это может пойти не так во многих отношениях, и мне повезло, я «сбросил все» и попытался установить после выполнения следующих действий:

[…] см. ссылку для списка шагов


Так что да, вполне вероятно, что эмуляция x86 QEMU может использовать ту же аппаратную поддержку, что и эмуляция x86 Rosetta-2. Они оба являются эмуляторами x86.

И, как вы сказали, основная проблема заключается в том, что Apple предоставляет общедоступные API для включения режима HW, чтобы людям не приходилось устанавливать этот модуль ядра вручную; я уверен, что большинство людей не захотели бы этого делать. Я мало что знаю о ситуации с программным обеспечением, меня больше интересовали детали архитектуры процессора.