Экспериментирую с qemu на макоси. Запускаю его в докере. Сам докер запущен в виртуалке с arm64 (стандартный docker desktop). Меня интересует виртуализация x86_64 (через tcg).
Собственно есть два способа:
Способ 1, используя arm64 образ с arm64 сборкой qemu. Ну тут всё понятно, qemu эмулирует x86_64 код, интерпретируя его своим arm64 билдом.
Способ 2, используя x86_64 образ с x86_64 сборкой qemu. А вот это самое интересное. У Apple есть Rosetta, которая умеет транслировать x86_64 код в arm64 и выполнять его, делая всё это на лету. Это вообще говоря работает весьма быстро. Но для виртуалок это использовать невозможно, т.е. к примеру запустить Windows XP через Rosetta не выйдет. Docker эту розетту для линукса тоже умеет использовать. Т.е. в ARM64 виртуалке можно запустить x86_64 бинарник.
И вот я таким макаром запускаю qemu (конечно в tcg режиме). Он транслирует x86_64 код в x86_64 код, и выполняет его. И в этот момент подключается розетта и уже она это всё безобразие транслирует в ARM64. Честно говоря я не ожидал, что оно вообще заработает.
Но, очевидно, заработало, по крайней мере для ISO от Alpine Linux. Загрузилось.
Самое интересное это производительность. Мерял через openssl speed md5
, приведены значения для типа 8192 bytes.
На хосте : 545620.17k
В докере arm64 : 656146.43k
В докере amd64 : 537531.73k
В докере arm64 и далее в виртуалке amd64: 306571.95k
В докере amd64 и далее в виртуалке amd64: 353517.57k
Странно, конечно, что в докере работает быстрей, ну там линуксовый openssl, а на хосте сборка от Apple, видимо по-разному собрали.
Как видно, простой код транлсируется неплохо, и извращенский вариант с розеттой даже даёт небольшой выигрыш.
Не знаю, что тут можно ещё сказать, но вот так вот, решил зачем-то поделиться, живите теперь с этим.