простой эмулятор (программистское)
Dec. 25th, 2013 01:37 amx5602 - a simple 6502 CPU emulator
Проект, демонстрирующий очень простой эмулятор микропроцессора 6502 (который широко использовался в самом начале эры персональных компьютеров - Atari, Apple II, Commodore 64...). Если вы знаете язык C даже в общих чертах, и никогда не писали код, симулирующий работу процессора, то этот проект - хорошее введение в то, как к этому вообще подходить.
Я иногда думаю, что должно быть больше обучающего кода - сознательно игрушечных проектов, написанных специально для того, чтобы научить читателя, с чего начинать и как все организовывать в данной области. Таких вот, как этот проект. Наверное, самые обычные примеры этого - разнообразные игрушечные операционные системы и компиляторы, использующиеся в университетских курсах на эти темы.
Проект, демонстрирующий очень простой эмулятор микропроцессора 6502 (который широко использовался в самом начале эры персональных компьютеров - Atari, Apple II, Commodore 64...). Если вы знаете язык C даже в общих чертах, и никогда не писали код, симулирующий работу процессора, то этот проект - хорошее введение в то, как к этому вообще подходить.
Я иногда думаю, что должно быть больше обучающего кода - сознательно игрушечных проектов, написанных специально для того, чтобы научить читателя, с чего начинать и как все организовывать в данной области. Таких вот, как этот проект. Наверное, самые обычные примеры этого - разнообразные игрушечные операционные системы и компиляторы, использующиеся в университетских курсах на эти темы.
no subject
Date: 2013-12-24 11:54 pm (UTC)no subject
Date: 2013-12-25 01:30 am (UTC)no subject
Date: 2013-12-25 02:12 am (UTC)— кодировке инструкции и операндов
— числу и типу операндов
— типу операции (ADD, XOR, CALL, etc)
Это может несколько сократить switch в декодере инструкций, но взамен получатся большие таблицы (или много маленьких) и логика будет в коде менее явная. Останутся всякие switch'и (или, опять же, будут таблицы) для выполнения той или иной операции по её уникальному номеру.
Далее, в зависимости от крутизны процессора, на котором будет происходить эмуляция, организация кода эмулятора может существенно влиять на скорость эмуляции. Один большой switch может оказаться самым эффективным решением.
Даже для эмуляции очень симметричного и простого для декодирования MIPS'а с четырёхбайтовыми инструкциями нужно поддержать около сотни инструкций общего назначения, и это занимает где-то 600+ строк очень компактного C кода (с длинными строками, за 100 символов:).
Кстати, о большом switch'е и MIPS'е... MIPS на MIPS'е эмулируется (если мы не говорим о виртуализации или продвинутых вещах типа бинарной трансляции) лучше всего (с т.з. производительности) с одним большим switch'ем. Бóльшая часть нужных переменных (в т.ч. временных, создаваемых компилятором) помещается в регистры (штук 20 из 32-х доступны), а если ещё и почти не вызывать ф-ций изнутри этого switch'а, получаются минимальные накладные расходы на переливание из пустого в порожнее и на переходы туда-сюда-обратно. Можно получить всего около 25 инструкций эмулятора на эмуляцию одной инструкции. Сильно структурированный красивый и «правильный» код может раздуть эти 25 до 75-100. Не уверен, что так и надо писать. :)
no subject
Date: 2013-12-25 02:16 am (UTC)Попробуй предсказать размер программы на Си, эмулирующей писишку (XT), включая какой-нибудь графический режим, чтобы в игрушки можно было играть.
no subject
Date: 2013-12-25 02:21 am (UTC)no subject
Date: 2013-12-25 02:26 am (UTC)no subject
Date: 2013-12-25 02:55 am (UTC)no subject
Date: 2013-12-25 03:23 am (UTC)no subject
Date: 2013-12-25 03:45 am (UTC)Ты частично декодируешь инструкцию, немного её модифицируешь (добавляешь или убираешь префиксы размера операнда и адреса, выбрасываешь сегментные префиксы, меняешь адрес, закодированный в инструкции в полях ModR/M, SIB, disp), запихиваешь её в специально подготовленный буфер, где уже есть инструкции до и после, которые загружают регистры значениями из эмулятора и потом выгружают результат обратно. После этого передаёшь управление на буфер. Вот и готова одна инструкция типа ADD AX, [BX] без полного декодирования и полной честной эмуляции.
Понятно, что нужно отлавливать инструкции типа системных и тех, которые трогают вещи, которые нельзя трогать (сегменты, флаги, IP (передача управления), SP и пр.), и их уже честнее эмулировать. И ещё деление нужно специально обрабатывать чтобы эмулятор вдруг не упал сам.
Так ещё можно сделать. Но это трюк не пройдёт на другом железе.
no subject
Date: 2013-12-25 12:41 pm (UTC)no subject
Date: 2013-12-25 12:51 pm (UTC)no subject
Date: 2013-12-25 12:56 pm (UTC)no subject
Date: 2013-12-25 03:39 am (UTC)А в чем там принципиальная сложность, и что может быть непонятного в том как к этому подходить ? (процессор ведь без внутренней параллельности выполнения инструкций, что усложнило бы задачу).
Пишем структуру данных соответствуюшую регистрам, флагам и прочему, и реализуем инструкции процессора по документации. Что еще ?
no subject
Date: 2013-12-25 03:55 am (UTC)Иногда хочется чтобы временные характеристики (или время, наблюдаемое внутри эмулируемого кода, текло ожидаемым образом) максимально сохранялись.
Иногда хочется имеющиеся особенности и глюки существующего железа полностью повторить (например, знаете что именно процессор сделает со сдвигаемым регистром, если счётчик сдвига содержит слишком большое число, и документация на процессор, говорит, что в этой ситуации результат не определён? Или что-то типа MOV EAX, SS — знаете что процессор положит в старшие 16 бит EAX на процессоре более старом, чем Pentium? И т.д.).
Кроме всего этого, документация часто содержит неточности и ошибки. Например, на x86 я сверял документацию Intel с документацией AMD и с тем, что на самом деле делал процессор. Много чего нашёл.
Т.е. вроде так ничего особенного, но часто это прорва работы, и не каждому под силу, особенно начинающему программисту.
no subject
Date: 2013-12-27 03:39 pm (UTC)Есть что-то более мощное, чем threaded code (http://en.wikipedia.org/wiki/Threaded_code) или JIT?
no subject
Date: 2013-12-28 05:18 am (UTC)no subject
Date: 2013-12-25 06:33 am (UTC)http://pythontutor.com/visualize.html#
Он работает конечно на повыше. Но позволяет пошагово визуализировать исполнение достаточно сложных вещей.
no subject
Date: 2013-12-25 11:49 am (UTC)http://www.visual6502.org/JSSim/