Эмуляция процессора x86 - как мне начать? - PullRequest
6 голосов
/ 18 мая 2011

Недавно я узнал, что Фабрис Беллард создал реализацию QEMU (более или менее, вы понимаете) в JavaScript, эмулируя i586.Это заинтересовало меня, так как я всегда был очарован сложностью, которая вписывается в микропроцессор - поэтому я хочу достичь той же задачи по реализации эмулятора x86.Однако, вероятно, это будет не так сложно, очевидно;это не главное.

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

Также я был бы признателен за любой вклад тех из вас, кто уже достигчто я с нетерпением пытаюсь сделать.Есть ли книги, которые я должен держать за своим столом?(Обратите внимание, что я люблю книги. Я был бы очень признателен за рекомендации.) Документы?Веб-сайты, которые я должен знать?... и пр.

Заранее спасибо.

1 Ответ

8 голосов
/ 22 мая 2011

Прежде всего, какова ваша реальная цель? Вас интересует точный симулятор образовательного типа или вы пытаетесь использовать vmware со скоростью типа qemu / kvm, которая в последнем случае использует процент выполнения инструкций на самом хост-процессоре (не имитируя). Даже если вы не хотите выполнять на хосте, но если вы заинтересованы в производительности (возможно, жертвуете точностью, отладкой или проверкой ошибок), посмотрите источники mame, существует длинный список симуляторов процессора, написанных для скорости.

Тот, который я упомянул выше, был написан больше для образовательных целей, в частности для меня и для всех, кто может найти это интересным. Для этой модели я рекомендую несколько ключевых моментов. Абстрагируйте операции чтения, записи и выборки из вашей памяти (у вас есть функции read_mem_8 (), write_mem_8 () и т. Д., Которые, как аппаратные средства, выполняют декодирование адресов и т. Д.). Аналогичным образом абстрагируйте регистр операций чтения / записи в функции. Симулятор сосредотачивается вокруг выполнения единственной функции инструкции, которая вызывается в цикле для фиксированного количества инструкций или бесконечного цикла, или где-то в середине, по вашему выбору. Таким образом, вы можете управлять режимом прерывания из переднего плана или из других режимов вне функции, которая управляет декодированием команд. Декодер команд мало чем отличается от дизассемблера, он проще в том смысле, что для наборов команд переменной длины (например, x86) вам не нужно искать способ поиска в байтах в поисках начала инструкции, выполнив вы предполагаете, что двоичный файл является реальным и код выполняется, естественно, хотя вам необходим какой-то неопределенный обработчик команд.

x86 не будет моим первым выбором по длинному списку причин. И здесь, каковы ваши цели? В x86 будут 32/64 битные режимы, схемы защиты памяти, несколько режимов выполнения и т. Д. Я бы (и много раз) начал с более простых инструкций, установленных для первых нескольких раз, msp430, рис. (более старая картинка не dspic или pic32), 6502 и т. д. В мире мамы есть 6502 рома, с которыми можно играть. (обратите внимание, что некоторые из 6502 симуляторов там есть ошибки). Msp430 и рис имеют мало инструкций и являются дневным проектом, как только вы получаете все. Рука может стать ступенькой к x86, если вы все еще чувствуете, что действительно нуждаетесь в x86. Различные режимы исполнения, вы можете имитировать известные mmu и fpu по желанию и загрузку linux, windows и т. Д.

Перечитывая твой вопрос, я, возможно, упростил свой ответ, похоже, у тебя есть некоторый опыт. x86 ничем не отличается от любого другого процессора тем, что вам нужно скомпилировать несколько простых двоичных файлов, которые, например, подсчитывают и зацикливают, и атакуют этот двоичный файл, декодируют и выполняют, увеличивают сложность ваших тестовых программ, добавляя дополнительные инструкции, поддерживаемые вашему симулятору некоторый момент, который становится скучным, и настало время для длительной сессии набора текста, прохождения и реализации всех инструкций (без обязательного тестирования каждой из них). Затем вернитесь и попробуйте выполнить более сложные двоичные файлы (чтобы проверить все новые инструкции). Я склонен использовать самопроверяющиеся тесты, такие как сжатие некоторых данных, а затем распаковка с использованием пакета с открытым исходным кодом (скомпилированного для встроенного) и сравнение входных и выходных данных. Также хороши процедуры шифрования, aes, des и т. Д. Md5, sha, которые не являются самопроверками, но вы можете предварительно вычислить ответ на платформе хоста и жестко закодировать ответ в тесте. с открытым исходным кодом JPEG, PNG и др. MP3 декодер. Есть фиксированные JPEG-и MP3-декодеры, или вы можете пойти с программным обеспечением. Разные компиляторы производят разные комбинации команд, некоторые компиляторы вообще не используют определенные инструкции или последовательности команд, поэтому я настоятельно рекомендую взять эти тестовые программы, перекомпилировать и запустить их как с несколькими различными настройками оптимизации, так и с таким количеством компиляторов, которое вы можете получить для этого. процессор. Разные языки высокого уровня также должны создавать разные смеси команд. Вы можете обнаружить, что один отдельный программист, использующий один язык и один компилятор, даст вам только ограниченный охват, у этого человека есть специфические привычки и стили программирования, которые ограничивают разнообразие в выводе, то же самое касается ассемблера, которого собирается иметь ограниченный набор инструкций, которые они генерируют.

...