Эмуляция (Операционные Системы)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 17:08, 14 мая 2016.

Эмуляция (англ. emulation) – это совокупность логических и технических средств и ресурсов, направленных на полную имитацию технического устройства выбранной пользователем системы для максимально точного воспроизведения всех процессов, происходящих внутри эмулируемой системы.

История

Впервые о проблеме ускорения процесса симуляции заговорили в IBM в конце 50-х годов, когда в компании столкнулись с недостаточной производительностью при использовании программной симуляции в своих разработках, а также при интеграции в них программ, написанных для машин прошлого поколения. При разработке продуктов линейки IBM System 360 инженеры компании применили систему микрокода, которая показала увеличение производительности относительно систем, использовавших инструменты программной симуляции. В 1964 году IBM вводит понятие «эмуляции» для описания принципа микрокода для программного форсирования процесса симуляции.

Различие процесса эмуляции и симуляции

Эмуляция это всего лишь попытка зеркально сымитировать внутреннее устройство эмулируемой системы таким образом, чтобы программа, отвечающая за эмуляцию какой либо из систем в точности повторяла все ее процессы и работу компонентов эмулируемой системы.

Симуляция, в свою очередь, это попытка сымитировать конкретную функцию или часть устройства, не повторяя в точности ее процессы и работу ее отдельных компонентов для данной системы. Например, программа, имитирующая игровой автомат, которая выполняет родную для него программу ROM, будет являться эмулятором, а эта же программа, написанная для другой системы, но при этом не являющейся файлом ROM, который был предназначен только работы с той системой под которую он был изначально сделан, называется симулятор.

Виды эмуляций

Самый частый вид эмуляции - это вид, в котором воспроизводится только архитектура компьютера. Таким образом, если требуется операционная система, хранящаяся в ПЗУ, или другое программное обеспечение, его следует получить дополнительно (впрочем, оно тоже может быть эмулировано). В дальнейшем и операционная система и программное обеспечение будут интерпретированы эмулятором таким же образом, как и на изначальном оборудовании. Помимо интерпретаторов эмулированных двоичных машинных кодов требуется эмуляция других аппаратных составляющих. В идеальном случае, эмулятор должен копировать поведение оригинального схематического решения эмулируемой системы.  Как правило, эмуляторы отталкиваются от модели, построенной на имеющейся документации и логической схеме устройства. Но существуют такие эмуляции, где для систем важным оказывается высокая точность эмуляции вплоть до тактовой частоты отдельных элементов, недокументированных функций, непредсказуемых аналоговых компонентов и допущенных ошибок.

Стоит отметить существование устройств, которые имеют очень ограниченный прямой доступ к оборудованию. В их случаях достаточно простого слоя совместимости. Системные запросы эмулируемой программы транслируются в системные запросы хоста, то есть в системах FreeBSD, NetBSD и OpenBSD для запуска Linux -приложений с закрытым кодом используется слой совместимости с Linux. Например, графический процессор Nintendo 64 был полностью программируемым, и большинство разработчиков игр использовало заложенные заводские программы, которые были самодостаточными и обменивались информацией с игрой через буфер FIFO. Поэтому многие эмуляторы вообще не эмулируют графический процессор, интерпретируя вместо этого команды центрального процессора также как и оригинальная программа.

Структура систем эмуляций

Эмулятор – программа эмуляции, как правило, состоит из модулей, которые выполняют процессы, соответствующие процессам эмулируемой системы. Наиболее распространенная схема представляет собой:

  • модуль эмуляции CPU;
  • модуль эмуляции подсистемы памяти;
  • модули эмуляции различных устройств ввода-вывода

Центральный процессор – самая трудоемкая часть создания эмулятора. Для упрощения процесса создания эмуляторов аще всего используют «готовые» модули CPU. Самая простая форма CPU – интерпретатор, программа отслеживающая поток выполнения программы и при встрече машинной инструкции выполняет операцию «языкового перевода» оригинальным инструкциям на процессоре хоста.

Интерпретаторы популярны при моделировании ЭВМ крайне низкой по сегодняшним меркам производительностью, однако этого бывает достаточно, учитывая простоту реализации таких способов эмуляции Для эмуляции устройств с сравнимой производительностью машины-хоста используется процесс «компиляции на лету», что позволило решить проблемы с самомодифицирующиесями кодами и отсутствием надежного способа разделения данных. Компилятор ожидает, пока поток управления процессором не перейдет в область, содержащую нетранслированный код. Только тогда («на лету») происходит трансляция блока кода в код, который может быть выполнен. Обработанный код помещается в кэш кода, при этом оригинальный код не подвергается изменению. В таком случае даже блоки данных подвергнутся бессмысленной трансляции компилятором, единственным эффектом чего будет увеличение времени работы транслятора.

Эмуляция подсистемы памяти чаще всего представляет из себя как минимум две процедуры – для чтения из памяти и для записи в нее, отвечающие за координаты нахождения правильного объекта. Такой подход связан с особенностью совместимости логического адреса и физической памятью при осуществлении процесса эмуляции.

Что касается, устройства системы ввода-вывода при эмуляции, то тут стоить отметить, что системные шины эмулируются очень редко, так в эмуляторе отсутствует система универсального интерфейса. В виду существования возможности идеально подогнать устройство ввода–вывода к параметрам эмулированного устройства значительно увеличивается производительность. Конкуренцию упрощенным моделям могут составить решения на базе унифицированных API. Их преимущество заключается в наборе плагинов, с помощью которых, с эмулятором могут работать сторонние устройства. Как правило, даже в самых простых эмуляторах предусмотрена виртуальная инфраструктура такого рода:

  • управление прерываниями посредством процедуры, которая устанавливает флаги, считываемые эмулятором CPU, когда объявлено прерывание, что позволяет виртуальному CPU «опрашивать прерывания»
  • запись и чтение физической памяти посредством двух процедур, подобных обслуживающим логическую память (однако, в отличие от последнего, первые часто могут быть заменены простыми ссылками на массив памяти).

Отличительные особенности процессов виртуализации от эмуляции

Виртуализатор исполняет код на том же процессоре, используя специальные режимы работы процессора. Ресурсы (память, диск и др.) предоставляет также напрямую или перехватывая обращения для «подсовывания» нужных данных. Иначе говоря, виртуализатор или совсем не эмулирует (имитирует) реальную машину, её архитектуру и процессор или делает это в минимальном варианте для отдельных ресурсов, для выполнения поставленной перед ним задачи.

Эмулятор - полностью или почти полностью реализует для исполнения кода отдельную машину со своей архитектурой и своими ресурсами. Вплоть до того, что может быть процессор совершенно другой архитектуры, к примеру ARM, Power или калькулятора МК-52. Так же необходимо отметить, что при эмуляции осуществляется изоляция процессов эмулируемой системы, для максимально точного исполнения поведения данной системы в пределах хост-машины и для защиты корректного поведения систем этой машины

Соответственно, преимущества виртуализатора в скорости исполнения кода, программа в "виртуалке" без специальной поддержки будет работать медленнее всего на 30-50%. При наличии поддержки виртуализации специальными командами процессора задержки могут быть совсем не большими по сравнению с нативным исполнением, разница в скорости может быть буквально несколько процентов.

Оценка процесса эмуляции

К плюсам можно отнести

  • Возможность сохранения работы в одной технологической инфраструктуре при использовании разных библиотек приложений и операционных систем относительно их платформ создания и хронологии.
  • Эмуляторы сокращают трудозатраты и оптимизируют возможность разработки кросс-платформенных приложений.

Из недостатков можно выделить следующее:

  • Использование эмуляции в пиратских целях.
  • Эмуляция способствует развитию сферы нарушений авторских прав и интеллектуальной собственности.

Ссылки