Самый популярный вопрос о моем эмуляторе Windows

ретровин32

(после “Зачем тебе это вообще нужно?”) Вопрос в том, как это работает. Сегодня ответ кажется мне очевидным, но до того, как я его понял, он был для меня огромной загадкой. Поэтому я постараюсь объяснить это так, чтобы вы тоже поняли.

Эмуляция Windows API

Для начала представьте, что вы работаете на машине x86, на которой установлена ​​операционная система, отличная от Windows, и вам нужно каким-то образом запустить программу Windows. Главный вывод из наблюдения за Wine (который, как следует из расшифровки аббревиатуры Wine Is Not Emulator,

нет

является эмулятором) заключается в том, что исполняемый файл Windows содержит последовательность команд x86, и ваша машина x86 уже может запускать ее напрямую. Затем для запуска файла

.exe

Windows, просто загрузите его в память (для чего нужно распаковать файл формата

.exe

) и скажите процессору перейти к первой инструкции.

Единственное, что осталось (а это очень большая задача), так это то, как этот exe взаимодействует с операционной системой, например, как он открывает файлы или показывает что-то на экране. Механизм сильно различается для разных операционных систем, но в конечном итоге зависит от интерфейса ядра. В конкретном случае Windows интерфейс ядра довольно запутанный (Идентификаторы системных вызовов различаются для разных версий Windows.), а стабильной границей API обычно считается библиотека DLL со знакомыми именами, такими как kernel32.dll. (Это полная противоположность Linux, который известен с вашим вниманием иметь очень стабильный интерфейс на границе ядра).

Это работает так: формат файла .exe может объявить: “Эй, мне нужно вызвать функцию kernel32.dll С именем WriteFile()“, и когда .exe загружается, операционная система помещает соответствующий код в соответствующее место для работы функции. Затем в Windows функция kernel32 вызывает соответствующий интерфейс ядра. Это полезно для нашей цели запуска файла в ОС, отличной от Windows, потому что нам нужно только предоставить наши реализации этих функций, даже без учета интерфейса ядра.

ЧИТАТЬ  Рождественское меню со словарем

Это именно то, что делает Wine: скачивает файлы .exe и предоставляет реализации всех библиотек DLL Windows. Естественно, на практике все гораздо сложнее, и Вину понадобились столетия человеко-часов программистов, чтобы воспроизвести все особенности и причуды интерфейса Windows, который сам выставлялся десятилетиями. Хайрама Лоу.

Пример глубины кроличьей норы можно увидеть этот фрагментнаходится в большом двоичном объекте ассемблерного кода x86 диспетчера системных вызовов Wine:

/* Legends of Runeterra подменяет первую команду возврата системного вызова,
 * и ожидает, что туда перейдёт выполнение. Изменяем адрес возврата соответствующим образом. */
"subq $0xb,0x70(%rcx)\n\t"

В отличной статье

как работает вино

подробнее о вине. Я намеренно опустил многие детали.

(Кстати, у Wine есть интересный вариант использования, не имеющий никакого отношения к цели этого поста — если у вас есть исходный код программы для Windows, вы можете скомпилировать для сгенерированной Wine реализации Windows API и получить собственный исполняемый файл в качестве вывода.)

эмуляция x86

Все вышеперечисленное прекрасно работает на оборудовании x86, но что, если вы используете другую архитектуру, например новые Mac с процессорами ARM? Поэтому вам нужно эмулировать инструкции x86 так же, как эмулятор Game Boy может эмулировать процессор Game Boy.

А это непростая задача! Apple также добавила ARM в свои процессоры. выделенная поддержка x86для ускорения эмуляции. Но разобравшись с ним, можно пойти дальше двумя разными путями.

Во-первых, необходимо дополнительно эмулировать все аппаратное обеспечение машины x86, такое как BIOS и дисковые интерфейсы, чтобы вы могли установить на свой эмулятор настоящую ОС Windows. Этот подход используется в кто. Также есть веб-эмулятор v86способный работать под управлением множества различных операционных систем, включая Windows.

ЧИТАТЬ  «Наши люди не кладут солнцезащитный крем в пекарню». Что такое меланома и зачем нужно следить за родинками

Прелесть этого подхода в том, что он запускает реальную копию Windows; поэтому все программы Windows будут работать нормально. Основной недостаток такого подхода заключается в том, что вам необходимо установить реальную копию Windows, что требует много места на диске и времени для запуска Windows перед запуском программ.

Второй подход заключается в эмуляции набора инструкций x86 и использовании Wine, описанного выше, в качестве реализации огромного Windows API, основанного на чем-то более простом для эмуляции, например на API ядра Linux. После публикации retrowin32 я узнал Вино в коробкахкоторый выполняет эту задачу в Интернете и способен запускать множество сложных программ Windows.

ретровин32 подход

Мой проект retrowin32 в основном связан с изучением того, что мне интересно. На данный момент это означает, что у меня не очень хороший эмулятор x86, не очень хорошая реализация win32, и я изучил несколько связанных с этим проблем.

В целом, я думаю, что если вы хотите запустить программу Windows в Интернете, то BoxedWine и v86, вероятно, лучше. Но если вам интересно мое исследование, то ждите следующего поста, в котором я напишу о текущем состоянии retrowin32.



Source

от admin