В вычислительной технике эмулятор — это аппаратное или программное обеспечение , которое позволяет одной компьютерной системе (называемой хостом ) вести себя как другая компьютерная система (называемая гостем ). Эмулятор обычно позволяет хостовой системе запускать программное обеспечение или использовать периферийные устройства, разработанные для гостевой системы. Эмуляция относится к способности компьютерной программы в электронном устройстве эмулировать (или имитировать) другую программу или устройство.
Многие принтеры , например, разработаны для эмуляции принтеров HP LaserJet , поскольку для принтеров HP написано много программного обеспечения. Если принтер, не являющийся HP, эмулирует принтер HP, любое программное обеспечение, написанное для настоящего принтера HP, также будет работать в эмуляции принтера, не являющегося HP, и производить эквивалентную печать. Начиная, по крайней мере, с 1990-х годов многие энтузиасты и любители видеоигр использовали эмуляторы для игры в классические аркадные игры 1980-х годов, используя оригинальный машинный код и данные игр 1980-х годов, которые интерпретируются системой текущей эпохи, и для эмуляции старых игровых консолей (см. эмулятор игровой консоли ).
Аппаратный эмулятор — это эмулятор, который принимает форму аппаратного устройства. Примерами служат DOS-совместимая карта, установленная в некоторых компьютерах Macintosh 1990-х годов , таких как Centris 610 или Performa 630 , которая позволяла им запускать программы для персональных компьютеров (ПК) и аппаратные эмуляторы на основе программируемых вентильных матриц . Тезис Чёрча-Тьюринга подразумевает, что теоретически любая операционная среда может быть эмулирована в любой другой среде, предполагая, что ограничения памяти игнорируются. Однако на практике это может быть довольно сложно, особенно когда точное поведение эмулируемой системы не задокументировано и должно быть выведено с помощью обратного проектирования . Он также ничего не говорит об ограничениях по времени; если эмулятор не работает так же быстро, как при использовании оригинального оборудования, программное обеспечение внутри эмуляции может работать гораздо медленнее (возможно, вызывая прерывания таймера, которые изменяют поведение).
«Может ли Commodore 64 эмулировать MS-DOS ?» Да, [Commodore] 64 может эмулировать IBM PC [использующий MS-DOS], в том же смысле, в каком можно вытащить воду из озера Мичиган с помощью чайной ложки .
— Письмо в Compute! и редакционный ответ, апрель 1988 г. [1]
Большинство эмуляторов просто эмулируют аппаратную архитектуру — если для желаемого программного обеспечения требуется прошивка операционной системы или программное обеспечение, оно также должно быть предоставлено (и само может быть эмулировано). И ОС, и программное обеспечение будут интерпретироваться эмулятором , а не запускаться нативным оборудованием. Помимо этого интерпретатора для языка эмулируемой двоичной машины , некоторое другое оборудование (например, устройства ввода или вывода) также должно быть предоставлено в виртуальной форме; например, если запись в определенную область памяти должна влиять на то, что отображается на экране, то это должно быть эмулировано. Хотя эмуляция может, если довести ее до крайности, опуститься до атомного уровня, основывая свой вывод на моделировании реальной схемы от виртуального источника питания, это было бы весьма необычным решением. Эмуляторы обычно останавливаются на моделировании документированных спецификаций оборудования и цифровой логики. Достаточная эмуляция некоторых аппаратных платформ требует чрезвычайной точности, вплоть до уровня отдельных тактовых циклов, недокументированных функций, непредсказуемых аналоговых элементов и ошибок реализации. Это особенно актуально для классических домашних компьютеров, таких как Commodore 64 , программное обеспечение которых часто зависит от сложных низкоуровневых программных приемов, придуманных программистами игр и « демосценой ».
Напротив, некоторые другие платформы очень мало использовали прямую аппаратную адресацию, например, эмулятор для PlayStation 4. [2] В этих случаях может быть достаточно простого уровня совместимости . Это преобразует системные вызовы для внешней системы в системные вызовы для хост-системы, например, уровень совместимости Linux, используемый в *BSD для запуска закрытого исходного кода собственного программного обеспечения Linux на FreeBSD и NetBSD . [3] Например, хотя графический процессор Nintendo 64 был полностью программируемым, большинство игр использовали одну из нескольких готовых программ, которые в основном были автономными и взаимодействовали с игрой через FIFO ; поэтому многие эмуляторы вообще не эмулируют графический процессор, а просто интерпретируют команды, полученные от ЦП, как это делала бы исходная программа. Разработчики программного обеспечения для встраиваемых систем или игровых консолей часто разрабатывают свое программное обеспечение на особенно точных эмуляторах, называемых симуляторами, прежде чем испытывать его на реальном оборудовании. Это делается для того, чтобы программное обеспечение могло быть создано и протестировано до того, как окончательное оборудование будет существовать в больших количествах, так что его можно было бы протестировать, не тратя время на копирование программы для отладки на низком уровне и не внося побочных эффектов отладчика . Во многих случаях симулятор фактически производится компанией, поставляющей оборудование, что теоретически увеличивает его точность. Эмуляторы математических сопроцессоров позволяют программам, скомпилированным с математическими инструкциями, работать на машинах, на которых не установлен сопроцессор, но дополнительная работа, выполняемая ЦП, может замедлить работу системы. Если математический сопроцессор не установлен или присутствует на ЦП, когда ЦП выполняет любую инструкцию сопроцессора, он создаст определенное прерывание (сопроцессор недоступен), вызывая процедуры математического эмулятора. Когда инструкция успешно эмулируется, программа продолжает выполняться.
Логическое моделирование — это использование компьютерной программы для моделирования работы цифровой схемы, такой как процессор. [4] Это делается после того, как цифровая схема была спроектирована в логических уравнениях, но до того, как схема будет изготовлена в аппаратном обеспечении.
Функциональное моделирование — это использование компьютерной программы для имитации выполнения второй компьютерной программы, написанной на символическом языке ассемблера или языке компилятора , а не на двоичном машинном коде . Используя функциональный симулятор, программисты могут выполнять и отслеживать выбранные разделы исходного кода для поиска ошибок программирования (багов), не генерируя двоичный код. Это отличается от имитации выполнения двоичного кода, которая является программной эмуляцией. Первый функциональный симулятор был написан Autonetics около 1960 года [ необходима ссылка ] для тестирования программ на языке ассемблера для последующего выполнения в военном компьютере D-17B . Это позволило писать, выполнять и тестировать программы полета до того, как было построено аппаратное обеспечение компьютера D-17B. Autonetics также запрограммировала функциональный симулятор для тестирования программ полета для последующего выполнения в военном компьютере D-37C .
Эмуляторы игровых приставок — это программы, которые позволяют персональному компьютеру или игровой приставке эмулировать другую игровую приставку. Чаще всего они используются для воспроизведения старых видеоигр эпохи 1980-х — 2000-х годов на современных персональных компьютерах и более современных игровых приставках. Они также используются для перевода игр на другие языки, для изменения существующих игр и в процессе разработки «домашних» демонстрационных версий DIY и создания новых игр для старых систем. Интернет помог в распространении эмуляторов консолей, так как большинство из них — если не все — были бы недоступны для продажи в розничных магазинах. Примеры эмуляторов консолей, выпущенных за последние несколько десятилетий: RPCS3 , Dolphin , Cemu , PCSX2 , PPSSPP , ZSNES , Citra , ePSXe , Project64 , Visual Boy Advance , Nestopia и Yuzu .
Из-за своей популярности эмуляторы стали выдавать себя за вредоносные программы. Большинство этих эмуляторов предназначены для игровых консолей, таких как Xbox 360, Xbox One, Nintendo 3DS и т. д. Обычно такие эмуляторы делают невозможные на данный момент заявления, например, о возможности запускать игры Xbox One и Xbox 360 в одной программе. [5]
По мере того, как компьютеры и глобальные компьютерные сети продолжали совершенствоваться, а разработчики эмуляторов становились все более искусными в своей работе, промежуток времени между коммерческим выпуском консоли и ее успешной эмуляцией начал сокращаться. Консоли пятого поколения, такие как Nintendo 64 , PlayStation и карманные компьютеры шестого поколения , такие как Game Boy Advance , показали значительный прогресс в направлении эмуляции во время своего производства. Это привело к попыткам производителей консолей прекратить неофициальную эмуляцию, но последовательные неудачи, такие как Sega против Accolade 977 F.2d 1510 (9th Cir. 1992), Sony Computer Entertainment, Inc. против Connectix Corporation 203 F.3d 596 (2000) и Sony Computer Entertainment America против Bleem 214 F.3d 1022 (2000), [6] имели противоположный эффект. Согласно всем правовым прецедентам, эмуляция является законной в Соединенных Штатах. Однако несанкционированное распространение кода, защищенного авторским правом, остается незаконным, как в соответствии с национальным законодательством об авторском праве , так и международным законодательством об авторском праве в соответствии с Бернской конвенцией . [7] [ требуется лучший источник ] Согласно законодательству Соединенных Штатов, получение сброшенной копии BIOS оригинальной машины является законным в соответствии с постановлением Lewis Galoob Toys, Inc. против Nintendo of America, Inc. , 964 F.2d 965 (9th Cir. 1992) как добросовестное использование, при условии, что пользователь получил законно приобретенную копию машины. Однако, чтобы смягчить это, несколько эмуляторов для платформ, таких как Game Boy Advance, способны работать без файла BIOS, используя высокоуровневую эмуляцию для имитации подпрограмм BIOS с небольшой потерей точности эмуляции. [ необходима цитата ]
Эмуляторы терминалов — это программы, которые предоставляют современным компьютерам и устройствам интерактивный доступ к приложениям, работающим на операционных системах мэйнфреймов или других хост-системах, таких как HP-UX или OpenVMS . Такие терминалы, как IBM 3270 или VT100 и многие другие, больше не производятся как физические устройства. Вместо этого программное обеспечение, работающее на современных операционных системах, имитирует «немой» терминал и может отображать графические и текстовые элементы хост-приложения, отправлять нажатия клавиш и обрабатывать команды, используя соответствующий протокол терминала. Некоторые приложения эмуляции терминала включают Attachmate Reflection , IBM Personal Communications и Micro Focus Rumba.
Другие типы эмуляторов включают в себя:
Обычно эмулятор делится на модули , которые примерно соответствуют подсистемам эмулируемого компьютера. Чаще всего эмулятор будет состоять из следующих модулей:
Шины часто не эмулируются либо по соображениям производительности, либо по соображениям простоты, а виртуальные периферийные устройства взаимодействуют напрямую с ЦП или подсистемой памяти.
Эмуляцию подсистемы памяти можно свести к простому массиву элементов, каждый из которых имеет размер эмулируемого слова; однако эта модель очень быстро дает сбой, как только какое-либо местоположение в логической памяти компьютера не соответствует физической памяти . Это, очевидно, имеет место всякий раз, когда эмулируемое оборудование допускает расширенное управление памятью (в этом случае логика MMU может быть встроена в эмулятор памяти, сделана отдельным модулем или иногда интегрирована в симулятор ЦП). Однако даже если эмулируемый компьютер не имеет MMU, обычно существуют другие факторы, которые нарушают эквивалентность между логической и физической памятью: многие (если не большинство) архитектуры предлагают отображаемый в память ввод-вывод ; даже те, которые часто не имеют блока логической памяти, отображаемого в ПЗУ , что означает, что модуль массива памяти должен быть отброшен, если необходимо эмулировать только для чтения природу ПЗУ. Такие функции, как переключение банков или сегментация, также могут усложнить эмуляцию памяти. В результате большинство эмуляторов реализуют как минимум две процедуры для записи в логическую память и чтения из нее, и именно эти процедуры должны сопоставлять каждый доступ с правильным местоположением правильного объекта.
В системе адресации с ограничением по базе, где память от адреса 0 до адреса ROMSIZE-1 доступна только для чтения, а остальная часть представляет собой ОЗУ, типичными будут следующие процедуры:
void WriteMemory ( word Address , word Value ) { word RealAddress ; RealAddress = Address + BaseRegister ; if (( RealAddress < LimitRegister ) && ( RealAddress > ROMSIZE )) { Memory [ RealAddress ] = Value ; } else { RaiseInterrupt ( INT_SEGFAULT ); } }
word ReadMemory ( word Address ) { word RealAddress ; RealAddress = Address + BaseRegister ; if ( RealAddress < LimitRegister ) { return Memory [ RealAddress ]; } else { RaiseInterrupt ( INT_SEGFAULT ); return NULL ; } }
Симулятор ЦП часто является самой сложной частью эмулятора. Многие эмуляторы написаны с использованием «заранее упакованных» симуляторов ЦП, чтобы сосредоточиться на хорошей и эффективной эмуляции конкретной машины. Простейшей формой симулятора ЦП является интерпретатор , который представляет собой компьютерную программу, которая следует потоку выполнения эмулируемого программного кода и для каждой обнаруженной инструкции машинного кода выполняет операции на хост-процессоре, которые семантически эквивалентны исходным инструкциям. Это становится возможным благодаря назначению переменной каждому регистру и флагу симулируемого ЦП. Логика симулируемого ЦП затем может быть более или менее напрямую переведена в программные алгоритмы, создавая программную повторную реализацию, которая в основном отражает исходную аппаратную реализацию.
Следующий пример иллюстрирует, как симуляция ЦП может быть выполнена интерпретатором. В этом случае прерывания проверяются перед выполнением каждой инструкции, хотя такое поведение редко встречается в реальных эмуляторах по причинам производительности (обычно быстрее использовать подпрограмму для выполнения работы прерывания).
void Execute ( void ) { if ( Interrupt != INT_NONE ) { SuperUser = TRUE ; WriteMemory ( ++ StackPointer , ProgramCounter ); ProgramCounter = InterruptPointer ; } switch ( ReadMemory ( ProgramCounter ++ )) { /* * Обработка каждой допустимой инструкции * происходит здесь... */ default : Interrupt = INT_ILLEGAL ; } }
Интерпретаторы очень популярны в качестве компьютерных симуляторов, поскольку их гораздо проще реализовать, чем более эффективные по времени альтернативные решения, и их скорость более чем достаточна для эмуляции компьютеров более чем десятилетней давности на современных машинах. Однако потеря скорости, присущая интерпретации, может стать проблемой при эмуляции компьютеров, скорость процессора которых того же порядка, что и у хост-машины [ dubious – discussion ] . До недавнего времени эмуляция в таких ситуациях многими [ dubious – discussion ] считалась совершенно непрактичной .
Прорваться через это ограничение позволили достижения в области методов динамической перекомпиляции [ сомнительно – обсудить ] . Простая априорная трансляция эмулируемого программного кода в код, исполняемый на хостовой архитектуре, обычно невозможна по нескольким причинам:
Различные формы динамической перекомпиляции, включая популярную технику компиляции Just In Time (JIT) , пытаются обойти эти проблемы, ожидая, пока поток управления процессором перейдет в место, содержащее нетранслированный код, и только тогда («точно вовремя») транслирует блок кода в код хоста, который может быть выполнен. Транслированный код хранится в кэше кода [ сомнительно – обсудить ] , а исходный код не теряется и не затрагивается; таким образом, даже сегменты данных могут быть (бессмысленно) транслированы рекомпилятором, что приводит к не более чем пустой трате времени на трансляцию. Скорость может быть нежелательной, поскольку некоторые старые игры не были разработаны с учетом скорости более быстрых компьютеров. Игра, разработанная для ПК с тактовой частотой 30 МГц и таймером уровня в 300 игровых секунд, может дать игроку только 30 секунд на ПК с тактовой частотой 300 МГц. Другие программы, такие как некоторые программы DOS, могут даже не работать на более быстрых компьютерах. В частности, при эмуляции компьютеров «закрытого типа», в которых изменения ядра системы не являются типичными, программное обеспечение может использовать методы, зависящие от конкретных характеристик компьютера, на котором оно работает (например, скорости его ЦП), и поэтому для правильной эмуляции таких приложений важен точный контроль скорости эмуляции.
Большинство эмуляторов, как упоминалось ранее, не эмулируют основную системную шину ; каждое устройство ввода-вывода, таким образом, часто рассматривается как особый случай, и не предоставляется согласованный интерфейс для виртуальных периферийных устройств. Это может привести к преимуществу в производительности, поскольку каждый модуль ввода-вывода может быть адаптирован к характеристикам эмулируемого устройства; однако конструкции, основанные на стандартном, унифицированном API ввода-вывода, могут соперничать с такими более простыми моделями, если они хорошо продуманы, и у них есть дополнительное преимущество «автоматического» предоставления подключаемого сервиса, через который сторонние виртуальные устройства могут использоваться в эмуляторе. Унифицированный API ввода-вывода не обязательно может отражать структуру реальной аппаратной шины: конструкция шины ограничена несколькими электрическими ограничениями и необходимостью управления параллелизмом оборудования , что в большинстве случаев можно игнорировать в программной реализации.
Даже в эмуляторах, которые рассматривают каждое устройство как особый случай, обычно существует общая базовая инфраструктура для:
Эмуляция — это одна из стратегий в стремлении к цифровому сохранению и борьбе с устареванием . Эмуляция фокусируется на воссоздании оригинальной компьютерной среды, что может быть трудоемким и сложным в достижении, но ценным из-за своей способности поддерживать более тесную связь с подлинностью цифрового объекта, операционной системы или даже игровой платформы. [8] Эмуляция обращается к оригинальной аппаратной и программной среде цифрового объекта и воссоздает ее на текущей машине. [9] Эмулятор позволяет пользователю иметь доступ к любому виду приложения или операционной системы на текущей платформе , в то время как программное обеспечение работает так же, как и в своей исходной среде. [10] Джеффри Ротенберг, один из первых сторонников эмуляции как стратегии цифрового сохранения , утверждает: «идеальный подход обеспечил бы единое расширяемое , долгосрочное решение, которое можно было бы разработать раз и навсегда и применять единообразно, автоматически и в организованной синхронности (например, при каждом цикле обновления) для всех типов документов и носителей». [11] Далее он утверждает, что это должно применяться не только к устаревшим системам, но и быть мобильным к будущим неизвестным системам. [12] Практически говоря, когда определенное приложение выпускается в новой версии, вместо того, чтобы решать проблемы совместимости и миграции для каждого цифрового объекта, созданного в предыдущей версии этого приложения , можно было бы создать эмулятор для приложения , предоставляющий доступ ко всем указанным цифровым объектам.
Из-за своего первичного использования цифровых форматов новое медиаискусство в значительной степени полагается на эмуляцию как стратегию сохранения. Такие художники, как Кори Аркангел, специализируются на возрождении устаревших технологий в своих работах и признают важность децентрализованного и деинституционализированного процесса для сохранения цифровой культуры. Во многих случаях целью эмуляции в новом медиаискусстве является сохранение цифрового носителя, чтобы его можно было сохранять бесконечно и воспроизводить без ошибок, чтобы не было зависимости от оборудования, которое стареет и устаревает. Парадокс заключается в том, что эмуляцию и эмулятор нужно заставить работать на будущих компьютерах. [13]
Методы эмуляции обычно используются при проектировании и разработке новых систем. Они облегчают процесс разработки, предоставляя возможность обнаруживать, воссоздавать и устранять недостатки в проекте еще до того, как система будет фактически построена. [14] Они особенно полезны при проектировании многоядерных систем, где ошибки параллелизма могут быть очень трудно обнаружить и исправить без контролируемой среды, предоставляемой виртуальным оборудованием. [15] Это также позволяет разрабатывать программное обеспечение до того, как будет готово оборудование, [16] тем самым помогая проверять проектные решения и давая немного больше контроля.
Слово «эмулятор» было придумано в 1963 году в IBM [17] во время разработки линейки продуктов NPL ( IBM System/360 ), использующей «новую комбинацию программного обеспечения , микрокода и оборудования ». [18] Они обнаружили, что моделирование с использованием дополнительных инструкций, реализованных в микрокоде и оборудовании, вместо программного моделирования с использованием только стандартных инструкций, для выполнения программ, написанных для более ранних компьютеров IBM, значительно увеличило скорость моделирования. Ранее IBM предоставляла симуляторы , например, для 650 на 705. [19] В дополнение к симуляторам, IBM имела функции совместимости на 709 и 7090 , [20] для которых она предоставила компьютеру IBM 709 программу для запуска устаревших программ, написанных для IBM 704 на 709 и позже на IBM 7090. Эта программа использовала инструкции, добавленные функцией совместимости [21], для перехвата инструкций, требующих специальной обработки; все остальные инструкции 704 выполнялись одинаково на 7090. Функция совместимости на 1410 [22] требовала только установки тумблера консоли, а не программы поддержки.
В 1963 году, когда микрокод был впервые использован для ускорения этого процесса моделирования, инженеры IBM придумали термин «эмулятор» для описания этой концепции. В 2000-х годах стало общепринятым использовать слово «эмулировать» в контексте программного обеспечения. Однако до 1980 года «эмуляция» относилась только к эмуляции с помощью аппаратного обеспечения или микрокода, в то время как «симуляция» относилась к чистой программной эмуляции. [23] Например, компьютер, специально созданный для запуска программ, разработанных для другой архитектуры, является эмулятором. Напротив, симулятором может быть программа, которая работает на ПК, так что старые игры Atari могут быть смоделированы на нем. Пуристы продолжают настаивать на этом различии, но в настоящее время термин «эмуляция» часто означает полную имитацию машины, выполняющей двоичный код, в то время как «симуляция» часто относится к компьютерному моделированию , где компьютерная программа используется для моделирования абстрактной модели. Компьютерное моделирование используется практически в каждой научной и инженерной области, и компьютерные науки не являются исключением: существует несколько проектов, имитирующих абстрактные модели компьютерных систем, например, сетевое моделирование , которое и практически, и семантически отличается от сетевой эмуляции. [24]
Аппаратная виртуализация — это виртуализация компьютеров как полных аппаратных платформ, определенных логических абстракций их компонентов или только функциональности, необходимой для работы различных операционных систем . Виртуализация скрывает физические характеристики вычислительной платформы от пользователей, представляя вместо этого абстрактную вычислительную платформу. [25] [26] Изначально программное обеспечение, управляющее виртуализацией, называлось «программой управления», но со временем предпочтительными стали термины « гипервизор » или «монитор виртуальной машины». [27] Каждый гипервизор может управлять или запускать несколько виртуальных машин .
{{cite book}}
: CS1 maint: others (link)