Как работают эмуляторы и как они написаны? [закрыто]

Как уже упоминалось в другом месте, это не то, что ggplot2 будет хорошо работать, поскольку сломанные оси обычно считаются сомнительными.

Другие стратегии часто считаются лучшими решениями этой проблемы. Брайан упомянул несколько (огранки, два сюжета, посвященные различным наборам ценностей). Еще один вариант, который слишком часто игнорируют люди, особенно для штрих-кодов, заключается в создании таблицы :

enter image description here [/g2]

Глядя на фактические значения, 500 не скрывает различия в других значениях! По какой-то причине таблицы не получают достаточного уважения в качестве метода визуализации. Вы можете возразить, что ваши данные имеют много и много категорий, которые становятся громоздкими в таблице. Если это так, вполне вероятно, что на вашей гистограмме будет слишком много баров, чтобы быть разумным.

И я не спорю о таблицах все времени. Но они определенно должны что-то учитывать, если вы создаете баррикады с относительно небольшим количеством баров. И если вы делаете барчарты с множеством баров, вам может потребоваться переосмыслить это в любом случае.

Наконец, есть также функция axis.break в пакете plotrix, которая реализует сломанные оси. Однако из того, что я собираюсь, вам придется вручную указывать метки и позиции оси.

968
задан Michael Myers 11 June 2013 в 16:00
поделиться

11 ответов

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

Основная идея:

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

эмуляция Процессора:

существует три способа обработать эмуляцию процессора:

  • Интерпретация
  • Динамическая перекомпиляция
  • Статическая перекомпиляция

Со всеми этими путями, у Вас есть та же полная цель: выполните часть кода, чтобы изменить состояние процессора и взаимодействовать с 'аппаратными средствами'. Состояние процессора является скоплением регистров процессора, обработчиков прерываний, и т.д. для данной цели процессора. Для этих 6502 у Вас было бы много 8-разрядных целых чисел, представляющих регистры: A, X, Y, P, и S; у Вас также было бы 16-разрядное PC регистр.

С интерпретацией, Вы запускаете в IP (указатель команд - также названный PC, счетчик команд) и читаете инструкцию из памяти. Ваш код анализирует эту инструкцию и использует эту информацию для изменения состояния процессора, как определено процессором. Базовая проблема с интерпретацией состоит в том, что это очень медленно; каждый раз, когда Вы обрабатываете данную инструкцию, необходимо декодировать ее и выполнить необходимую операцию.

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

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

  • Код, который не находится в программе для начала (например, сжатый, зашифрованный, генерировал/изменил во времени выполнения, и т.д.) не будет перекомпилирован, таким образом, это не будет работать
  • , было доказано, что нахождение всего кода в данном двоичном файле эквивалентно Проблема остановки

, Они объединяются для создания статической перекомпиляции абсолютно неосуществимой в 99% случаев. Для получения дополнительной информации Michael Steil провел некоторое большое исследование в статическую перекомпиляцию - лучшее, которое я видел.

другая сторона к эмуляции процессора является путем, которым Вы взаимодействуете с аппаратными средствами. Это действительно имеет две стороны:

  • Процессор, синхронизирующий
  • Обработка прерываний

синхронизация Процессора:

платформы Certain - особенно более старые консоли как NES, SNES, и т.д. - требуют, чтобы Ваш эмулятор имел строгую синхронизацию, чтобы быть абсолютно совместимым. С NES у Вас есть PPU (пиксельный блок обработки), который требует, чтобы ЦП поместил пиксели в свою память в точные моменты. При использовании интерпретации можно легко считать циклы и эмулировать надлежащую синхронизацию; с динамической/статичной перекомпиляцией вещами является/lot/более сложное.

Обработка прерываний:

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

Аппаратная эмуляция:

существует две стороны к эмуляции данного устройства:

  • Эмуляция функциональности устройства
  • Эмуляция интерфейсов существующего устройства

Берут случай жесткого диска. Функциональность эмулирована путем создания внешней памяти, считайте/пишите/форматируйте стандартные программы и т.д. Эта часть обычно очень проста.

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

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

Ресурсы:

я думаю, что дал довольно хорошее введение здесь, но существует тонна из дополнительных областей. Я более, чем рад помочь с любыми вопросами; я был очень неопределенен в большей части из этого просто из-за огромной сложности.

Обязательные ссылки Википедии:

Общие ресурсы эмуляции:

  • Zophar - Это - то, где я получил свой запуск с эмуляцией, сначала загрузив эмуляторы и в конечном счете разграбив их огромные архивы документации. Это - абсолютный лучший ресурс, который Вы можете возможно иметь.
  • NGEmu - Не много прямых ресурсов, но их форумы непобедимы.
  • RomHacking.net - раздел документов содержит ресурсы относительно архитектуры машины для популярных консолей

проекты Эмулятора сослаться:

  • IronBabel - Это - платформа эмуляции для.NET, записанной в Nemerle, и перекомпилировало код к C# на лету.Отказ от ответственности: Это - мой проект, так простите бесстыдный разъем.
  • BSnes - потрясающий эмулятор SNES с целью идеальной для цикла точности.
  • MAME - эмулятор галереи. Большая ссылка.
  • 6502asm.com - Это - эмулятор JavaScript 6502 с прохладным небольшим форумом.
  • dynarec'd 6502asm - Это - немного взлома, я сделал более чем день или два. Я взял существующий эмулятор с 6502asm.com и изменил его для динамичной перекомпиляции кода к JavaScript для крупных увеличений скорости.

ссылки перекомпиляции Процессора:

Приложение:

Это был хорошо более чем год, с тех пор как этот ответ был отправлен, и со всем вниманием это добиралось, я полагал, что пора обновить некоторые вещи.

, Возможно, самая захватывающая вещь в эмуляции прямо сейчас libcpu, запущенный вышеупомянутым Michael Steil. Это - библиотека, предназначенная для поддержки большого количества ядер процессора, которые используют LLVM для перекомпиляции (статичный и динамичный!). Это имеет огромный потенциал, и я думаю, что это сделает большие вещи для эмуляции.

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

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

1126
ответ дан Serkan 11 June 2013 в 16:00
поделиться

Да, необходимо интерпретировать целую двоичную путаницу машинного кода "вручную". Не только, что, большую часть времени также необходимо моделировать некоторые экзотические аппаратные средства, которые не имеют эквивалента на целевой машине.

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

17
ответ дан Lawrence Dol 11 June 2013 в 16:00
поделиться
  • 1
    извините, я didn' t обновляют страницу прежде, чем добавить мой комментарий. Это было только ради полноты. Довольный Вы упомянули:) – jweyrich 13 June 2010 в 02:26

При разработке эмулятора, Вы интерпретируете блок процессора, что система продолжает работать (Z80, 8080, ЦП PS, и т.д.).

также необходимо эмулировать все периферийные устройства, которые система имеет (видеовыход, контроллер).

необходимо начать писать эмуляторы для simpe систем как старое доброе Game Boy (которые используют процессор Z80, я не не путающий), ИЛИ для C64.

15
ответ дан Peter Mortensen 11 June 2013 в 16:00
поделиться
  • 1
    @jweyrich: Я знал, что кто-то скажет, что так видят мой комментарий перед Вашим комментарием:) – Brian R. Bondy 13 June 2010 в 02:24

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

Любой процессор обычно имеет правильно написанную спецификацию, которая описывает состояния, взаимодействия, и т.д.

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

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

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

Рассмотрение очень медленной производительности старых видеоигр (NES/SNES, и т.д.), эмуляция легка на довольно современных системах. На самом деле еще более удивительно, что Вы могли просто загрузить ряд каждой игры SNES когда-либо или любой игры Atari 2600 когда-либо, полагая, что то, когда эти системы были популярным свободным доступом наличия к каждому картриджу, будет осуществленной мечтой.

43
ответ дан mmcdole 11 June 2013 в 16:00
поделиться
  • 1
    " Почему бы не bool IsEmpty () метод..." - существуют некоторые серьезные основания не к. Самый важный - это it' s обычно contex-зависимый, имеет ли это смысл. Больше надежного решения должно использовать boost::optional<T>, чтобы указать, есть ли у Вас допустимый объект T или нет. Это будет препятствовать тому, чтобы Вы звонили x.foo() когда x.IsEmpty()==true – MSalters 14 June 2010 в 12:07

Парень по имени Victor Moya del Barrio записал свой тезис по этой теме. Большая хорошая информация на 152 страницах. Можно загрузить PDF здесь .

, Если Вы не хотите регистрироваться в scribd, можно погуглить для заголовка PDF, "Исследование методов для эмуляции, программируя" . Существует несколько других источников для PDF.

126
ответ дан alex 12 June 2013 в 03:00
поделиться

Совет относительно эмуляции реальной системы или Вашей собственной вещи? Я могу сказать, что эмуляторы работают путем эмуляции ВСЕХ аппаратных средств. Возможно, не вниз к схеме (поскольку перемещающиеся биты как HW сделали бы. Перемещение байта является конечным результатом, настолько копирующим байт, прекрасен). Эмулятор очень трудно создать, так как существует много взломов (как в необычных эффектах), синхронизируя проблемы, и т.д. что необходимо моделировать. Если один (вход) часть является неправильной, что вся система может недооценить или в лучшем случае иметь ошибку/незначительный сбой.

4
ответ дан 19 December 2019 в 20:20
поделиться

Также посетите сайт Darek Mihocka Emulators.com , где вы найдете полезные советы по оптимизации на уровне инструкций для JIT и многие другие полезные советы по созданию эффективных эмуляторов.

9
ответ дан 19 December 2019 в 20:20
поделиться

Эмулятор очень сложно создать, так как существует множество хаков (например, необычных эффектов), проблем с синхронизацией и т. Д., Которые необходимо моделировать. .

Для примера см. http://queue.acm.org/detail.cfm?id=1755886 .

Это также покажет вам, почему вам «нужен» много-ГГц процессор для эмуляции 1-мегагерцового.

10
ответ дан 19 December 2019 в 20:20
поделиться

Эмулятор устройства с общим исходным кодом содержит собираемый исходный код для эмулятора PocketPC / Smartphone (требуется Visual Studio, работает в Windows). Я работал над версиями V1 и V2 двоичной версии.

Он решает многие проблемы эмуляции: - эффективная трансляция адресов из гостевых виртуальных в гостевые физические в виртуальные хосты - JIT-компиляция гостевого кода - моделирование периферийных устройств, таких как сетевые адаптеры, сенсорный экран и аудио - Интеграция пользовательского интерфейса для основной клавиатуры и мыши - сохранение / восстановление состояния, для моделирования выхода из режима пониженного энергопотребления

4
ответ дан 19 December 2019 в 20:20
поделиться

Я знаю, что этот вопрос немного устарел, но я хотел бы добавить кое-что к обсуждению. Большинство ответов здесь сосредоточено вокруг эмуляторов, интерпретирующих машинные инструкции систем, которые они эмулируют.

Однако существует очень известное исключение из этого, называемое "UltraHLE" (статья в WIKIpedia). UltraHLE, один из самых известных эмуляторов, когда-либо созданных, эмулировал коммерческие игры Nintendo 64 (с приличной производительностью на домашних компьютерах) в то время, когда это считалось невозможным. На самом деле, когда UltraHLE был создан, Nintendo все еще выпускала новые игры для Nintendo 64!

Впервые я увидел статьи об эмуляторах в печатных журналах, тогда как раньше я видел их обсуждение только в Интернете.

Концепция UltraHLE заключалась в том, чтобы сделать невозможное возможным, эмулируя вызовы библиотеки C вместо вызовов машинного уровня.

29
ответ дан 19 December 2019 в 20:20
поделиться

Создав свой собственный эмулятор микрокомпьютера BBC 80-х годов (введите VBeeb в Google), следует знать несколько вещей.

  • Вы не эмулируете реальную вещь как таковую, это была бы реплика. Вместо этого вы эмулируете состояние. Хороший пример - калькулятор, у настоящего есть кнопки, экран, корпус и т. д. Но для эмуляции калькулятора вам нужно только эмулировать, находятся ли кнопки вверх или вниз, какие сегменты ЖК-дисплея включены и т. д. В общем, набор чисел, представляющих все возможные комбинации вещей, которые могут меняться в калькуляторе.
  • Вам нужно только, чтобы интерфейс эмулятора выглядел и вел себя как настоящий. Чем более убедительным это будет, тем ближе эмуляция. То, что происходит за кулисами, может быть каким угодно. Но для удобства написания эмулятора существует мысленное отображение, которое происходит между реальной системой, т.е. чипами, дисплеями, клавиатурами, печатными платами, и абстрактным компьютерным кодом.
  • Чтобы эмулировать компьютерную систему, проще всего разбить ее на более мелкие части и эмулировать эти части по отдельности. Затем соединить все вместе, чтобы получить готовый продукт. Это похоже на набор черных ящиков с входами и выходами, что прекрасно подходит для объектно-ориентированного программирования. Вы можете дополнительно разделить эти куски, чтобы сделать жизнь проще.

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

18
ответ дан 19 December 2019 в 20:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: