|
Выпуск 2 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Доброе время суток, уважаемые читатели! Второй выпуск рассылки будет посвящен тем вопросам, с которых бы следовало начать еще первый, а именно:
Эмуляция. От английского 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):
А вот вторая программа [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-R7, AR0-AR7, IP, флаги CF, ZF, SF, OF, DF, IF), строковой эквивалент выполненного опкода (Last KOP) и рабочий адрес эмулятора (NowAddr). Последняя часть представляет из себя консоль, с которой и управляется весь эмулятор. Рассмотрим ее команды (они регистрозависимы!):
Легко видно, что в этом эмуляторе средства отладки относительно примитивны. Несмотря на это, они вполне адекватны. Вы можете скачать программу эмулятора и запустить ее командой run, там подготовлена небольшая демонстрация. Обратите внимание, с момента запуска процессора он начинает выполнять уже свои инструкции и все, что вы увидите далее на экране слева - результат работы программы, написанной в машинном коде. На этом, мне хотелось бы закончить второй выпуск рассылки. Спасибо за внимание. Автор рассылки: Виктор Петренко (Top)
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||