Научная статья на тему 'Язык спецификации архитектуры ЭВМ и периферийных устройств'

Язык спецификации архитектуры ЭВМ и периферийных устройств Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
539
83
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
ЯЗЫКИ ПРОГРАММИРОВАНИЯ / СИНТАКСИЧЕСКИЙ АНАЛИЗ / ИНТЕРПРЕТАТОРЫ / ЭМУЛЯТОРЫ ЭВМ / PROGRAMMING LANGUAGES / PARSING / INTERPRETERS / COMPUTER EMULATORS

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Бурлаков Алексей Сергеевич, Хмельнов Алексей Евгеньевич

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

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

The language of specification of computer architecture and peripheral devices

The paper observes the formal language designed for computers architecture and it’s peripherals specification, it also observes the software developed to debug specifications written in this language. Syntactic construction are brought as an example and their semantic is explained and parsing methods are briefly reviewed. The language developed may be applied for documenting of architecture particularities as well as in the programs someway using information of computer architecture.

Текст научной работы на тему «Язык спецификации архитектуры ЭВМ и периферийных устройств»

2. Информационные системы и технологии

УДК 519.682

© А.С. Бурлаков, А.Е. Хмельное ЯЗЫК СПЕЦИФИКАЦИИ АРХИТЕКТУРЫ ЭВМ И ПЕРИФЕРИЙНЫХ УСТРОЙСТВ

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

Ключевые слова: языки программирования, синтаксический анализ, интерпретаторы, эмуляторы ЭВМ.

© A.S. Burlakov, A.E. Hmelnov

THE LANGUAGE OF SPECIFICATION OF COMPUTER ARCHITECTURE AND

PERIPHERAL DEVICES

The paper observes the formal language designed for computers architecture and it's peripherals specification, it also observes the software developed to debug specifications written in this language. Syntactic construction are brought as an example and their semantic is explained and parsing methods are briefly reviewed. The language developed may be applied for documenting of architecture particularities as well as in the programs someway using information of computer architecture.

Keywords: programming languages, parsing, interpreters, computer emulators.

Введение

В технической литературе, немало книг посвящено описанию различного оборудования ЭВМ, в главной степени описанию архитектуры процессора. Полное описание архитектуры x86-64 приводится на 3439ти страницах трех томов документации Intel [1]. Отдельный сайт посвящен описанию архитектуры ARM процессоров [2]. Учебники и справочники языка assembler для конкретной архитектуры часто содержат её подробное описание.

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

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

При создании языка был учтен опыт авторов составляющих учебники и справочники посвященные описанию архитектуры ЭВМ [3-6]. В особенности был использован источник [3], где автор посвятил отдельную главу проблеме описания архитектуры ЭВМ.

Для спецификации машинных команд были использованы наработки авторов из источника [7]. В отличие от подхода, приведенного авторами в [7], наш язык не ограничивается описанием операндов процессорных команд, а позволяет целиком описывать архитектуру компьютера.

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

1. Синтаксис и семантика языка

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

Основной структурной (не синтаксической) единицей языка является класс, реализующий логику работы соответствующего устройства. Взаимодействие программы и текста описания основано на событийном программировании. Пример приведен ниже, в разделе посвященном скелету эмулятора и виртуальной машине. За основу синтаксиса языка спецификации был взят язык программирования C++ ISO/IEC c некоторыми заимствованиями из языка C++/CLI и других языков программирования.

Кроме стандартных лексических конструкций свойственных большинству императивных языков программирования, в языке спецификации реализован декларативный оператор для описания команд процессора, операторы для работы с частью переменной (оператор извлечения последовательности байт и бит), оператор для работы с несколькими переменными (оператор конкатенации) и другие [3,8].

В силу того, что язык спецификации является интерпретируемым, появляется возможность использования ссылок, указывающих не на конкретную область памяти (как в случае использования компилируемых языков вроде C++), а на динамические конструкции вроде l-value выражений [9].

Одним из возможных терминалов l-value выражения является переменная, которая может быть либо скалярной числовой переменной, либо свойством объекта (property), которое обладает методами записи и чтения. Другим из возможных терминалов l-value выражения может быть функция, которая возвращающает ссылочный тип данных. Проверка корректности l-value выражений происходит во время и после разбора текста описания. Нетерминалами l-value выражения являются

операторы конкатенации, извлечения последовательности байт и бит._

lvalue expr: nested id // Переменная либо св-во

| nested id '(' expr list ')' // Метод | lvalue expr '[' expr num ']' // Извл-е одного байта // Извлечение последовательности байт | lvalue expr '[' expr num PERIOD expr num ']' | lvalue expr '<' expr num '>' // Извл-е одного бита // Извлечение последовательности бит | lvalue expr '<' expr num PERIOD expr num '>' | lvalue expr ':' lvalue expr // Конкатенация

Рисунок 1. Синтаксис 1-уа1ие выражения

Рассмотрим пример использования 1-уа1ие выражения.

bits<32> A = 0xffffffff; bits<1> CF = 0;

CF:A<16..0> = 0x1cdcd; // CF = 1, A = 0xffffcdcd

Рисунок 2. Пример использования 1-уа1ие выражения

На рисунке 2, в первых двух строках объявляются переменные Ли ОЕ длиной 32 и 1 бит соответственно. В третьей строке происходит операция присваивания, где первые 16 разрядов числа 0x1cdcd будут записаны в переменную А, а 17ый разряд будет записан во флаг ОЕ. Таким образом, после выполнения третьей строки, переменные А и ОЕ изменят свои значения на 0х£ £ £ £ cdcd и 1 соответственно.

Рассмотрим другой пример объявления подпрограмм (функций) и использования ссылочного типа данных.

bits<?>& R(bits<3> code, {

if(W) case(code){

maskb 0 0

maskb 0 0

maskb 0 1

maskb 0 1

maskb 1 0

maskb 1 0

maskb 1 1

maskb 1 1

}

bits<1> W = 1)

0 then return EAX;

1 then return ECX;

0 then return EDX;

1 then return EBX;

0 then return ESP;

1 then return EBP;

0 then return ESI;

1 then return EDI;

else

case(code){

maskb 0 0 0 then return AX;

maskb 0 0 1 then return CX;

maskb 0 1 0 then return DX;

maskb 0 1 1 then return BX;

maskb 1 0 0 then return SP;

maskb 1 0 1 then return BP;

maskb 1 1 0 then return SI;

maskb 1 1 1 then return DI;

}

};

void MOV(bits<?>& RegD, bits<?>& RegS ) {

RegD = RegS;

}

MOV(R(0), R(1));_

Рисунок 3. Пример объявления функции и использования ссылок

На рисунке 3 объявлены две функции: функция MOV, которая принимает на вход ссылки на регистр-источник и регистр-приемник, и функция R, возвращающая ссылку на соответствующий регистр выбираемый оператором case в зависимости от кода регистра. Например, вызов MOV (R(0),R( 1) ) в итоге выполнит присваивание EAX = ECX.

Оператор case по синтаксису и семантике напоминает одноименный оператор языка Transact SQL. В отличие от оператора множественного ветвления switch языка C++, case способен работать не только с константными значениями, но и c переменными, выражениями и битовыми масками. Последняя возможность является особенно удобной при описании формата команд процессора (см. Рисунок 4)._

bits<3> Ns, Nd; // Номер регистра источника и приемника

bits<1> W; // ? dword: word

unsigned short opcode = m memory.ReadByte(EIP);

case(opcode) {

maskb 1:0:0:0:1:0:1:W:1:1:Nd:Ns then MOV(R(Ns,W),R(Nd,W)); break;

maskb 0:1:0:0:Nd:0 then

INC(R(Nd)); break;

}_

Рисунок 4. Использование оператора case на примере описания формата команд MOV и INC (см. Рисунок 2) процессора архитектуры IA-32 [1]

В декларативном смысле, оператор case - это n-местный предикат, где n - это число вхождений переменных в конкатенацию заключенную между ключевыми словами maskb и then. (Для восьмеричной или шестнадцатеричной записи, используются masko или maskh соответственно, а сами числа записываются без префиксов 0 или 0x.) Предикат возвращает истину, если существует такое значение переменных входящих в конкатенацию, при которых она совпадает с аргументом оператора case. В этом случае, в аргументы входящие в конкатенацию записываются соответствующие значения, и далее выполняется последовательность инструкций, следующая за ключевым словом then. Последовательность инструкций при этом может носить императивный характер, и если она заканчивается оператором break или return, то проверка следующего предиката не происходит, и все последующие конструкции maskb ... then внутри текущего оператора case игнорируются.

2. Разбор текста спецификации

Для разбора текста спецификации используется синтаксический анализатор, сгенерированный программой Bison в совокупности с лексическим анализатором, полученным программой Flex. Поддерживается модульность на уровне файлов и проверка синтаксиса на этапе разбора текста. В силу того, что в синтаксисе языка присутствуют выражения, которые невозможно однозначно свернуть, используя только один предиктивный символ, было решено отказаться от алгоритма LALR(1) в пользу GLR. Основная разница этих алгоритмов заключается в том, что алгоритм GLR в отличие от алгоритма LALR(1) может выполнять откат более чем на один уровень при построении дерева разбора, в случае несовпадения продукции [10-12].

3. Структура программного средства для отладки языка

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

Текст спецификации

iz.

Синтаксический анализатор

Интерфейс пользователя

Командное окно

• create KBD of CKbdl8080

Экран монитора

Операционная система (Windows)

Библиотека SDL

Скелет эмулятора

Абстрактный Абстрактная Абстрактное Абстрактная

процессор память устройство 1 I клавиатура

Таблицы методов

Методы клавиатуры Методы устройства 1

Методы памяти

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

Методы процессора

Внутреннее представление текста спецификации архитектуры ЭВМ

Виртуальная машина

Рисунок 5. Схема программы

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

Для взаимодействия пользователя с эмулятором используется двухоконный пользовательский интерфейс. Первое окно является консольным, создается средствами операционной системы Windows и предназначено для конфигурирования и управления эмулятором. Второе окно является графическим, создается средствами библиотеки SDL и представляет собой экран виртуального графического устройства, например VGA монитора. Обработка сообщений окна, например нажатие клавиши или щелчок мыши реализуется за счет использования соответствующей библиотеки (Win API либо SDL) [13].

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

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

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

Рассмотрим пример. Абстрактное устройство клавиатуры способно получать сообщения библиотеки SDL о нажатии клавиши и её код. То, каким образом интерпретировать данное событие, определено в файле спецификации (см. Рисунок 6)._

class CKbdI8080 : public CKbd {

void KeyDown(bits<32> code)

{

}

void Compile(CComputer* pc){}; }_

Рисунок 6. Фрагмент описания устройства типа клавиатура

Получив сообщение о нажатии клавиши, абстрактное устройство клавиатуры вызовет метод KeyDown передав в параметре её код. После завершения работы метода KeyDown, управление будет возвращено абстрактной клавиатуре. Сама абстрактная клавиатура не способна напрямую работать с текстом описания, для этого к ней должен быть привязан экземпляр класса CKbdI8 08 0, созданный внутри виртуальной машины. Для корректной работы, класс CKbdI8 08 0, как уже было сказано должен реализовать все методы абстрактной клавиатуры, регламентируемые интерфейсом.

Для исполнения кода методов используется виртуальная машина. Состояние исполнения запоминается в памяти, которая состоит из кучи и стека. Аналогично тому, как это делают компиляторы языков программирования вроде Delphi и C++, в стеке интерпретатора располагаются локальные переменные, объявленные в тексте спецификации оборудования, а в куче - глобальные переменные, которые являются экземплярами классов описывающих это оборудование. Так, экземпляр класса CKbdI8080 будет располагаться именно в куче.

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

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

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

окно приложения (см. Рисунок 7)._

create PC of CComputerI8080 create CPU of CCpuI8080 create RAM of CMemI8 0 8 0 create KBD of CKbdI8 08 0

compile

load mon32.bin into RAM start

Рисунок 7. Пример конфигурирования эмулятора

В данном примере в первых четырех строках сценария эмуляции, виртуальная машина создает экземпляры классов CComputerI8 08 0, CCpuI8080, CMemI8080 и CKbdI8080 и привязывает эти экземпляры к соответствующим абстрактным устройствам, за каждым из которых зарезервировано имя: PC, CPU, RAM, KBD и т.п. для обозначения компьютера, центрального процессора, оперативной памяти и клавиатуры соответственно. Выполнение команды compile сопровождается вызовом виртуального метода Compile для каждого созданного объекта (см. Рисунок б). Команда load вызывает одноименный метод для объекта, закрепленного за устройством RAM, передавая в него файл образа памяти. Последняя команда запускает выполнение эмуляции.

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

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

Заключение

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

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

Литература

1. Intel® б4 and IA-32 Architectures Software Developer's Manual Combined Volumes: 1, 2A, 2B, 2C, 3A, 3B and 3C.

2. ARM Information Center, http://infocenter.arm.com/

3. Бруснецов Н.П. Микрокомпьютеры. - M.: Наука, Гл. ред. Физ.-мат. лит., 19S5. - C. 34-б4.

4. Майерс Г. Архитектура современных ЭВМ: В 2-кн. Кн. 1. Пер. с англ. - М.: Мир, 19S5. C. 1015.

5. Брамм П., Брамм Д. Микропроцессор S03S6 и его программирование: Пер. с английского. -М.: Мир, 1990. - 44S с.

6. Таненбаум Э. Архитектура компьютера. 5-е изд. - СПб.: Питер, 2013. - S44 с.

7. Ramsey N., Fernandez M. "Specifying Representation of Machine Instructions", ACM Trans. Program. Lang. Syst. Vol 19, No 3. 1997, pp. 492-524.

S. Бурлаков A.C. Описание семантики машинных команд // Материалы Всерос. молодежной на-уч.-практ. конф. с международ. участ. (Иркутск, 21-23 марта, 2013 г.). - Иркутск: Изд-во ИрГТУ, 2013. - С. 137-141.

9. Ахо А., Сети Р., Ульман Д. Компиляторы: принципы, технологии и инструменты: Пер. с англ. - М.: Издательский дом "Вильяме", 2003. - C. 37б-424.

10. Donald E. Knuth. "On the Translation of Languages from Left to Right", Information and control 19б5, Vol S, pp. 60S-639.

11. Фридл Дж. Регулярные выражения. Библиотека программиста. - СПб.: Питер, 2001. - C. 200-21S.

12. Bison - GNU parser generator, http://www.gnu.org/software/bison/

13. Simple DirectMedia Layer - Homepage, http://www.libsdl.org/index.php

Бурлаков Алексей Сергеевич, старший преподаватель кафедры информационных технологий иркутского государственного университета (664003, г. Иркутск, ул. Карла Маркса, 1), тел. (3952) 453112, E-mail: alex_burlakov@mail.ru

Хмельное Алексей Евгеньевич, кандидат технических наук, старший научный сотрудник института динамики систем и теории управления СО РАН (664033, г. Иркутск, ул. Лермонтова, 134, а/я 292), тел. (395-2) 453071, E-mail hmelnov@icc.ru

Burlakov Aleksey Sergeevich, senior teacher of department of Informational Technologies of Irkutsk State University (664003, Irkutsk, Karla Marksa str, 1).

Hmelnov Aleksey Evgenjevich, candidate of technical science, senior scientist of Institute for System Dynamics and Control Theory of Siberian Branch of Russian Academy of Sciences (664033, Irkutsk, Lermontova str, 134, POB 292).

i Надоели баннеры? Вы всегда можете отключить рекламу.