Введение

Эмулятор программного обеспечения, встроенный в классическую Mac OS для PowerPC. Эмулятор Mac 68k — это эмулятор программного обеспечения, встроенный во все версии классической Mac OS для PowerPC. Этот эмулятор позволял запускать приложения и системный код, изначально разработанные для моделей Macintosh на базе процессоров 680x0. За редкими исключениями, например, RAM Doubler от Connectix, эмулятор запускал всё программное обеспечение без ощутимых изменений, за исключением снижения производительности по сравнению с программой, скомпилированной для PowerPC.

Происхождение

Первая версия была написана Гэри Дэвидианом, который изначально создал её для использования на процессоре Motorola 88000, применявшемся в первой неудачной попытке Apple создать RISC-платформу. Более поздняя версия, использующая динамическую рекомпиляцию, была разработана Эриком Траутом, который впоследствии работал над успешными проектами эмуляции в Connectix, такими как Virtual Game Station и Virtual PC. До прихода Траута в компанию Connectix выпустила Speed Doubler, в состав которого входил ещё более быстрый эмулятор PowerPC 68k.

Реализация

Все версии этого эмулятора эмулировали подмножество инструкций "user" набора 68EC040 с использованием стека исключений, аналогичного 68020/68030. Документация Apple указывает, что эмулятор обеспечивал операционную среду, наиболее близкую к среде Macintosh Centris 610 – системы на базе микропроцессора Motorola 68LC040. Ранние версии эмулировали его путем декодирования каждой инструкции и немедленного выполнения серии эквивалентных инструкций PowerPC. Для PowerMac с PCI использовался эмулятор динамической рекомпиляции для повышения производительности. Динамическая рекомпиляция работает путем "рекомпиляции" часто используемых участков кода в более быстрые, нативные для PowerPC последовательности, которые кэшировались локально. Эмулятор мог распознавать одну и ту же последовательность кода 680x0 и выполнять ранее кэшированный код PowerPC, чтобы избежать повторного перевода. Теоретически, этот эмулятор мог эмулировать код 680x0 быстрее, чем любой реальный процессор 680x0 мог бы его выполнить. Отсутствие инструкций с плавающей точкой в 68LC040 упрощало эту задачу, хотя и не делало ее менее впечатляющей. Одной из причин успеха этой эмуляции было то, что многие API для Mac OS изначально были реализованы как программные ловушки на процессоре 680x0. Следовательно, вызов API воспринимался процессором 680x0 как эквивалент условия ошибки, что приводило к обработке этой ошибки через один из его аппаратных векторов. Этот вектор, в свою очередь, находил и запускал подпрограмму операционной системы из ROM или RAM. В эмуляторе такие ловушки можно было заменять нативным кодом PowerPC, так что эмулировался только сам код приложения, а любой вызываемый им системный API мог быть ускорен с помощью нативного кода PowerPC. Это также позволило Apple портировать ОС на PowerPC. Сначала переписывались только критически важные части кода, оставляя большую часть ОС эмулированной. Постепенно большая часть ОС была переписана для нативной работы, что со временем повышало производительность ОС. Для программиста переход на PowerPC был относительно безболезненным, поскольку эмулятор запускался и останавливался автоматически. Это было реализовано с помощью нового типа указателя, называемого Universal Procedure Pointer (UPP). Для кода 68k этот указатель выглядел как обычный указатель на код и мог использоваться как таковой. Однако на самом деле он указывал на структуру данных, содержащую специальную инструкцию ловушки и флаги, указывающие архитектуру набора инструкций (ISA) вызываемого кода. Из кода PowerPC этот UPP можно было передать функции CallUniversalProc() для его вызова. Эмулятор 68k затем обрабатывал такие детали, как представление переданных параметров в правильном порядке для соответствующей ISA, а также запускал и останавливал эмулятор по мере необходимости. Компиляторы для Mac OS автоматически создавали такие UPP при использовании соответствующих макросов, а системные библиотеки PowerPC содержали нативные заглушки для прозрачного вызова нативных или все еще 68k функций по мере необходимости. Это означало, что работа с двойной архитектурой требовала от программиста минимальных усилий, и, как и в случае с ОС, приложения могли довольно легко комбинировать код 680x0 и PowerPC.

Текущий статус

Поскольку он был встроен во все версии PowerPC классической Mac OS, эмулятор также являлся частью среды Classic в Mac OS X. Эмуляторы PowerPC Macintosh, такие как SheepShaver, соответственно, также используют этот эмулятор при запуске классической Mac OS. Нативная Mac OS X вне среды Classic никогда не использовала эмулятор.