Выпуск 2
[Main] [TMC 1] [TMC 2] [About]
[ 1 2 3 4 5 6 7 * ]


Доброе время суток, уважаемые читатели!

Второй выпуск рассылки будет посвящен тем вопросам, с которых бы следовало начать еще первый, а именно:

  • что подразумевает под собой задача эмуляции вычислительной системы вообще и ПК в частности;
  • какие цели обычно преследует разработка эмуляторов, а также, какую цель будет преследовать TMC и рассылка в частности.

Эмуляция. От английского emulation. Воспроизведение аппаратными или программными средствами либо их комбинацией работы других устройств или программ без потери функциональных возможностей или искажения получаемых результатов [из словаря context компании ИНФОРМАТИК].

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

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

Теперь поговорим о программной составляющей эмуляции. Прежде всего, хотелось бы отметить, что есть два сходных по возможностям, но различных по сути способов эмуляции. Дело в том, что обычно эмуляторы создают полностью виртуальную ВС. Это означает, что программы, выполняемые под его управлением получают полную иллюзию реальной аппаратной платформы. Простой пример. Несколько лет назад мне на глаза попался эмулятор Dendy. Помните, была такая игровая видео-приставка к телевизору, игры для нее были записаны на картриджах? Так вот, вместе с этим эмулятором я скачал с десяток образов картриджей. Получилось, что я могу играть в те игры (причем замечу, абсолютно те же игры, потому что их программы одинаковые с точностью до бита) на своем IBM PC и вместо картриджей использовал их бинарные образы в обычных дисковых файлах: Поскольку внутри Dendy стоит маломощный микропроцессор, его эмуляция обходится сравнительно дешево, поэтому эмулятор работал довольно свободно уже на 80486 процессоре (100MHz во всяком случае, кажется тогда у меня такой был). С другой стороны, мощность самой Dendy в лучшем случае доходит до 80286 (16 MHz), а скорее всего аналогична 8086 (8 MHz). Это довольно наглядно показывает, что эмуляция может обходиться непозволительно дорого.

Рассмотрим специальный случай эмуляции. Пусть архитектура эмулируемой ВС и эмулирующей совпадают. Рассмотрим пример. Для IBM PC существуют две более-менее заметные программы, которые позволяют выполнять код этой же архитектуры. Я говорю о VMWare и Bochs. Первую программу назвать эмулятором, в общем-то, нельзя. Это самая настоящая виртуальная машина (ВМ). Пояснение понятие ВМ я оставлю Дмитрию Иртегову, автору книги "Введение в операционные системы", BHV 2002 (стр. 7-8):

Системы виртуальных машин. Такие системы стоят несколько особняком. Система виртуальных машин - это ОС [Операционная Система], допускающая одновременную работу нескольких программ, но создающая при этом для каждой программы иллюзию того, что машина находится в полном ее распоряжении, как при работе под управлением ДОС. Зачастую, "программой" оказывается полноценная операционная система - примерами таких систем являются VMWare для машин с архитектурой x86 или VM для System/370 и ее потомков.

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

Часто СВМ являются подсистемой ОС общего назначения: MS DOS и MS Windows-эмуляторы для UNIX и OS/2, подсистема WoW в Windows NT/2000/XP, сессия DOS в Windows 3.x/95/98/ME, эмулятор RT-11 в VAX/VMS.

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

А вот вторая программа [Bochs] является полноценным эмулятором x86. Исходя из способа реализации можно сказать, что ВМ идет на некоторые ухищрения, и поэтому не может обеспечить точного исполнения программ для эмулируемой платформы, зато она работает потенциально быстрее. Иногда этого вполне достаточно. Например, очень удобно работать с Unix-ом, щелкнув по иконке на рабочем столе Windows 2000 :). В дальнейшем я собираюсь рассказывать только об эмуляторах, надеюсь, что теперь более-менее понятно что это такое и чем оно отличается от ВМ.

Перейдем теперь к рассмотрению эмулятора именно ПК. Этот класс ВС очень сложно точно определить. Сначала рассмотрим примеры реально существующих и пользующихся определенной популярностью ПК. В своей работе по TMC1 я руководствовался, в основном архитектурой IBM PC (на основе микропроцессоров семейства x86 компании Intel - www.intel.com ) и целой серией машин на основе микропроцессора MC68k (компании Motorola - www.motorola.com ). Также отнесем к ПК такие семейства ВС, как Spectrum, PDP-11 и пр. Вообще-то говоря, следует еще отметить, что с самого начала предполагается, что в основу любой архитектуры ПК заложены принципы Джона фон Неймана (1903-1957), что может быть и не так, в реальном мире. Существует множество очень интересных (как правило, экспериментальных) архитектур ВС, которые построены по другим принципам, и мы скорее всего рассмотрим их в каком-нибудь из следующих выпусков.

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

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

В качестве иллюстрации для первой категории целей можно упомянуть эмулятор архитектуры от Advanced Micro Devices - AMD x86-64. В скором времени, после выхода технических описаний и эмулятора, ребята из GNU перенесли компилятор GNU C/C++ на эту платформу. Самого же микропроцессора на тот момент еще не существовало физически.

Что касается иллюстрации лекционного курса, то здесь тоже все довольно очевидно. Скорее всего, весьма проблематично держать множество машин для иллюстрации их архитектур. В этом случае могут помочь их эмуляторы. На них просто продемонстрировать все основные программы и приемы программирования. Забегая вперед, скажу, что TMC предполагает объектно-ориентированное построение программы. Эмулируемую систему удастся рассмотреть не только с точки зрения ее программирования, а даже с точки зрения внутреннего устройства. Для этого вводятся программные классы, аналогичные реальным микросхемам (например, контроллер памяти, шина, устройство таймера).

Применение эмулятора в качестве тестовой платформы для приложений сложно переоценить. Фактически, мы получаем виртуальную ВС, состоянием которой сможем управлять. Мы можем выполнять программу по шагам и она не сможет этого обнаружить, можем изменять состояние регистров ЦП, ячеек памяти, "перешивать" ПЗУ и пр. Хорошим примером служит уже упомянутый эмулятор Bochs, который часто используется разработчиками ОС (в частности, он используется в проекте Dronix - home , sourceforge) для отладки ядра или его компонентов.

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

В завершающей части выпуска продолжим рассмотрение первой версии TMC и получившегося эмулятора.

Начну я с общего описания программы (ее можно взять здесь - 17kb).

R0=0000h AR0=0000h CF=0 R1=0000h AR1=0000h ZF=0 R2=0000h AR2=0000h SF=0 R3=0000h AR3=0000h OF=0 R4=0000h AR4=0000h DF=0 R5=0000h AR5=0000h IF=0 R6=0000h AR6=0000h R7=0000h AR7=0000h CPU Ready IP=C000h Last KOP= NowAddr=0000h
]run

После запуска экран условно делится на три части. Левая половина экрана может использоваться двумя способами: либо туда отображается вывод видеоадаптера из эмулируемой машины (по умолчанию), либо шестнадцатеричный дамп памяти. Во второй части (верхняя правая четверть экрана) расположены регистры (R0-R7, AR0-AR7, IP, флаги CF, ZF, SF, OF, DF, IF), строковой эквивалент выполненного опкода (Last KOP) и рабочий адрес эмулятора (NowAddr). Последняя часть представляет из себя консоль, с которой и управляется весь эмулятор. Рассмотрим ее команды (они регистрозависимы!):

  • help - скромная подсказка по командам консоли;
  • sm xxxx - ShowMemory - показать память с ячейки xxxx (далее везде xxxx, xx, yyyy, yy - это 16-ричные числа);
  • ss - ShowScreen - показать экран эмулируемой ВС (эта и предыдущая команда используют первую часть экрана);
  • wb xxxx yy - WriteByte - записывает байт yy по адресу xxxx (в том числе производится запись в ПЗУ);
  • chgr x yyyy - ChangeRegister - изменяет значение регистра Rx на значение yyyy;
  • chgar x yyyy - ChangeAddressRegister - изменяет значение регистра Arx на значение yyyy;
  • chgip xxxx - ChangeIP - изменяет значение указателя инструкций на xxxx;
  • chgf xxxx - ChangeFlags - устанавливает значения флагов в соответствие с битами xxxx (от младшего к старшему - CF, ZF, SF, OF, DF, IF);
  • chgst x - ChangeState - изменяет состояние работы процессора на x - 0 - HALTED, 1 - READY (процессор может быть либо готов к работе, либо остановлен. Останова можно добиться командой hlt);
  • m - MakeCycle - выполнить инструкцию процессора (выбирается из памяти по адресу IP, декодируется и исполняется);
  • run - запускает процессор на последовательное выполнение инструкций;
  • quit - выход из программы.

Легко видно, что в этом эмуляторе средства отладки относительно примитивны. Несмотря на это, они вполне адекватны.

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

На этом, мне хотелось бы закончить второй выпуск рассылки. Спасибо за внимание.

Автор рассылки: Виктор Петренко (Top)

[Main] [TMC 1] [TMC 2] [About]
[ 1 2 3 4 5 6 7 * ]