Аннотация: Описание архитектуры самой младшей модели семейства микропроцессоров с условным названием А4. Семейство отличается самоопределяемостью данных. (Правда в этой младшей модели, сопоставимой с современными пик-контроллерами, самоопределяемость урезана до минимума). Такой же как например МВК Эльбрус. Т.е. то и другое вовсе не машины фон-Неймана, а машины Лебедева. Вот только Эльбрус - 64-х разрядная супер-ЭВМ, ну очень большая по всем параметрам, а это - маленькие 16-и или даже 12-и разрядные микропроцессоры. "Масштабируемый магистральный интерфейс" придуман именно для них. Написано где-то в 1989-91 г.г.
Настоящим приводится описание архитектуры процессора А4.01 -
самой младшей модели семейства А4.
1. Целью разработки настоящей архитектуры является упрощение
создания программного обеспечения путем приближения машинного языка к
языкам высокого уровня.
Существуют области применения вычислительной техники, где критичным
является не производительность, а стоимость управляющего устройства. (А
часто габариты и энергопотребление.) При мелкосерийном производстве, а
так же в системах, требующих индивидуальной настройки или многократного
перепрограммирования на протяжении своего жизненного цикла, основная
часть затрат приходится на написание, а главное, отладку программного
обеспечения.
Снизить эти затраты можно либо применяя мощные кросс-средства, либо
упростив программирование за счет совершенствования архитектуры. Что и
сделано в семействе А4.
2. Семейство включает модели разного назначения и
производительности, делящиеся на три группы: "младшие", "средние" и
"старшие". Основой семейства является "базовая" модель, относящаяся к
группе "средних". В настоящей статье рассматриваются только "младшие"
модели.
Младшие модели обладают минимальными ресурсами и предназначены для
построения простейших контроллеров. Архитектура младших моделей -
упрощенный вариант базовой. В ней используется слово только
фиксированного размера, простейший ("начальный") режим адресации к
оперативной памяти, отсутствуют теги и базирующаяся на них
самоопределяемость данных. Последнее обстоятельство весьма существенно,
поэтому совместимость младших моделей с базовой только частичная.
3. Младшие модели работают со словами (операндами) фиксированного
размера представляющими целые числа в дополнительном коде.
Адресное пространство логически делится на сегменты. Обращение к
памяти производится с помощью адреса, состоящего из двух частей -
"селектора" и "смещения". Селектор указывает один из сегментов, смещение
- конкретное слово в сегменте. В базовой модели селекторы сегментов
распознаются аппаратурой и защищаются от некорректного использования (и
вообще от модефикации). В младших моделях такой защиты нет, но
модефицировать селекторы все равно не рекомендуется.
Обращение к внешним устройствам производится "как к памяти" -
специальных команд ввода/вывода нет. Управляющие регистры внешних
устройств доступны через сегмент ввода/вывода, имеющий максимальный
номер. Однако при необходимости внешнему устройству может быть
предоставлен собственный "физический" сегмент.
В процессоре отсутствуют программно-доступные регистры, вместо них
используется стэковый механизм, включающий два стэка - "управляющий" и
"операционный". Первый содержит состояние процесса в виде
последовательности записей, содержащих кроме полезной информации
(например адреса возврата из подрпрограммы) признак типа записи. Второй
используется для хранения обрабатываемых данных - промежуточных
результатов вычислений, локальных переменных, и для передачи параметров
между подпрограммами.
Система команд безадресная - большинство команд берет свои операнды с
вершины операционного стэка и туда же помещает результат. Команды
состоят только из кода операции, что и дало возможность организовать
программу по аналогии с "шитым кодом" языка Форт.
Система прерываний векторная. Вектора размещаются в начальных адресах
памяти. Прерывания переключают процессы и используются только для
реакции на различные события, как внешние, так и внутренние. Для реакции
на ошибки (типа деления на ноль) и различные аномальные ситуации,
складывающиеся при выполнении программы, существует "механизм ситуаций".
4. Стэковый механизм занимает центральное место в процессоре. Здесь
не приводится подробного описания его работы - оно существует отдельно.
Механизм включает два стэка, каждый из которых размещается в
отдельном сегменте. Оба стэка растут в сторону старших адресов. Вершина
операционного стэка - место, куда происходит наибольшее количество
обращений, отображается на содержащийся в процессоре массив регистров.
(Кроме, может быть, самых младших моделей.) Первая запись управляющего
стэка является заголовком процесса. Каждый процесс имеет свою
собственную пару стэков.
Операционный стэк имеет две программно-доступные области: "активную
часть" и "запись активации". Первая - область между вершиной и локальным
дном - содержит промежуточные результаты вычислений. Там же
накапливается список передаваемых подпрограмме параметров и остается
результат ее работы. Вторая - список локальных переменных подпрограммы.
Граница активной части стэка указывается регистром локального дна. (Ни
одна команда не может получить операнд, лежащие ниже локального дна.)
Положение и размер записи активации указывается регистрами базы и
размера.
Управляющий стэк программно недоступен, хранящаяся в нем информация
используется некоторыми командами. Например, при переходе к подпрограме
в него помещается, а при возврате - извлекается запись, содержащая адрес
возврата. Последнее действие интересно тем, что ищется запись именно
такого типа; если после нее в стэк были помещены другие записи, то они
поочередно извлекаются до тех пор, пока не будет найдена нужная. Каждая
извлеченная запись сразу используется по ее "прямому назначению".
Например, если подпрограмма преобразовала полученные параметры
(содержимое активной части стэка) в локальные переменные, тоесть создала
новую запись активации, местоположение старой было сохранено в
управляющем стэке. Естественно после адреса возврата. По логике вещей
при возврате из подпрограммы ее локальные переменные должны быть
уничтожены. Это происходит "само собой": Первыми из управляющего стэка
извлекаются параметры старой записи активации, в результате этого новая
уничтожается - на ее место переносится содержимое активной части стэка;
восстанавливается ранее сохраненное содержимое регистров базы и размера.
И только после этого становится доступен адрес возврата. (Если данные
верхушки стэка в это время окажутся отображенными на регистры процессора
(что и будет в большинстве случаев) то никакой физической пересылки
информации не произойдет.)
Перечислим действия процессора, в которых участвует стэковый
механизм:
- Вычисления - все команды преобразования информации работают с
вершиной стэка. При вычислениях используется дополнительный регистр "C",
куда помещается остаток при делении, выдвинутая часть слова при сдвиге,
а так же старшая часть суммы и произведения при арифметических
операциях. В нем же содержится старшая часть смещения при "расширенной"
адресации к физическим сегментам.
- Передача параметров подрограмме и возврат результата - производится
через активную часть стэка. Подпрограмма может работать с ними в
"Фортовском" стиле, постепенно преобразуя в возвращаемый результат, или
превратить в запись активации.
- Обращение к подпрограмме - производится традиционным образом. Вместе
с адресом следующей команды сохраняется регистр состояния процессора.
- Блочный цикл - организуется помещением в управляющий стэк записи с
границами блока. Действительный выход из такого блока - только
извлечением этой записи. Конструкция может использоваться как цикл,
аналогичный по свойствам оператору "For" языка Фокал, так и, вместе с
подпрограммой, как граница распространения ситуации.
- Структурный переход - используется для описаний действий программы в
аномальных случаях (от деления на ноль до необходимости преждевременно
выйти из цикла). Происходит при возникновении "ситуации" - переход в то
место, где предусмотрена реакция на данную ситуацию. Фактически
производится рекурсивный выход из всех вложенных циклов, подпрограмм,
блоков - из управляющего стэка извлекаются все записи подряд, пока не
встретится подходящая "ловушка". Если на ситуацию данного типа никем
небыло установлено ни одной ловушки - процесс аварийно завершается.
Когда ловушка найдена - производится предусмотренная в ней реакция и
нормальный выход из ближайшего объемлющего блока или подпрограммы.
5. Оперативная память младших моделей состоит из слов, заполняющих
полностью или частично, единственное физическое адресное пространство,
размер которого зависит от модели процессора.
Размер слова и следовательно разрядность процессора - 12 бит. Такой
размер выбран по многим причинам, одна из которых недостаточность восьми
и избыточность шестнадцати разрядов. Например, разрядность подавляющего
большинства аналого-цифровых (АЦП) и цифро-аналоговых (ЦАП)
преобразователей составляет 10 - 12 бит. 8-и разрядные - не обладают
достаточной точностью для большинства применений, а 16-и разрядные
являются прецезионными (и следовательно дороги). Для управления
оборудованием такая точность как правило не требуется. Другое
соображение: для контролера, выполняющего простые функции, объем памяти
в единицы килобайт представляется достаточным (тоесть 12-и битового
адреса должно хватить). Для машины следующего класса - персональной ЭВМ
требуется память в единицы мегабайт. Здесь достаточным будет 24-х
разрядный адрес. Адрес в 8 разрядов не годится ни для каких применений;
16-и разрядный адрес велик для контролеров, но мал для персоналок; адрес
в 32 разряда (так же как и в 36) образует адресное пространство,
характерное скорее для внешней, чем оперативной памяти, даже для больших
машин. При необходимости можно привести и другие соображения.
Память представляется процессору в виде набора сегментов.
Соответственно обращение к памяти производится с помощью "виртуального"
адреса, состоящего из селектора сегмента и смещения внутри него.
Сегменты делятся на "виртуальные" и "физические", отличающиеся
реализацией. Все виртуальные сегменты размещаются в единственном
"физическом" пространстве оперативной памяти и состоят из заголовка и
тела. Тело содержит полезную информацию, заголовок состоит из одного
слова и указывает тип сегмента (два младших бита) и его размер.
Физичесским является сегмент с селектором "0", позволяющий обращаться ко
всей оперативной памяти, и несколько последних сегментов (до 64 штук),
предназначенные для обращения к внешним устройствам.
При обращении к виртуальному сегменту начала извлекается заголовок,
проверяется, не выходит-ли смещение за размер сегмента, контролируется
тип; и только после этого происходит собственно чтение или запись слова
сегмента. (Для сокращения накладных расходов в процессоре (кроме самых
младших моделей) предусмотрено несколько регистров для хранения
параметров сегментов, к которым были последние по времени обращения.)
При обращении к физическому сегменту, выход за его границы
контролируется схемами самого запоминающего устройства.
Каждый сегмент принадлежит к одному из четырех типов:
- Сегмент данных - содержит произвольную информацию.
- Сегмент команд - содержит программу.
- Сегмент процесса - содержит заголовок процесса, и управляющий стэк.
- Специальный сегмент - в младших моделях не используется,
зарезервирован для дальнейшего расширения архитектуры.
В младших моделях используется простейший ("начальный") механизм
преобразования виртуальных адресов в физические: селектор сегмента
содержит старшую часть адреса заголовка виртуального сегмента в
оперативной памяти. Младшие несколько разрядов всегда равны нулю. Для
физического сегмента младшая часть селектора является (или аппаратно
преобразуется) в номером устройства, старшая содержит единицы.
Физические сегменты с четными номерами считаются сегментами команд, с
нечетными - сегментами данных. При обращении к физическим сегментам
используется "расширенный" адрес.
Обращение к управляющим регистрам внешних устройств производится теми
же командами, что и к памяти. Сегмент с самым большим номером во всех
моделях является окном в "пространство физических устройств": старшая
половина смещения указывает номер устройства, младшая - номер одного из
его регистров. (Всего до 64 устройств.) Несколько других сегментов со
старшими номерами (их количество зависит от модели) предназначены для
"персонального" доступа к некоторым внешним устройствам. Что особенно
удобно, если это ОЗУ (например экранная область), или ПЗУ. В частности,
предпоследний сегмент специально предназначен для подключения к нему ПЗУ
начального пуска.
6. Система команд - безадресная. Все команды, манипулируют с данными
на вершине операционного стэка, поэтому большинство из них состоят
только из кода операции, и только некоторые имеют непосредвтвенные
операнды. Сегмент команд содержит одну подпрограмму с единственной
точкой входа - через начало сегмента. Следовательно, для обращения к ней
нужен только селектор.
Все это дало возможность организовать систему команд по аналогии с
"шитым кодом" фортоподобных языков: команда и обращение к подпрограмме
выглядят совершенно одинаково. Различаются только тем, что у
"встроенной" команды (в отличии от "определяемой") четыре или (пять
старших) бит обязательно нулевые - соответствующие им сегменты
размещались бы в начале оперативной памяти, где находится таблица
векторов прерываний и другая служебная информация. (Еще одно соображение
в пользу 12-и разрядной памяти: потеря 4х бит на каждой команде не столь
существенна и окупается отсутсвием явной команды перехода к
подпрограмме; с потерей 8 бит (при 16-и разрядном слове) мириться было
бы уже нельзя.)
Каждая команда, как встроенная, так и определяемая (подпрограмма)
может иметь непосредственные операнды. Это несколько слов, следующих за
кодом операции (селектором) - 0, 1, 2, или неопределенное количество -
указывается первым словом. Для встроенных команд наличие и количество
непосредственных операндов фиксируется в архитектуре. Для подпрограмм -
указывается в первом слове сегмента команд. Это первое слово (фактически
продолжение заголовка сегмента) загружается непосредственно в регистр
состояния процессора и определяет режим его работы - флаги разрешения
прерывания, реакции на переполнение и смену знака; а у средних и старших
моделей еще и режим адресации и даже возможно систему команд.
Непосредственные операнды могут быть получены подпрограммой с помощью
специальной команды, даже если они ей "не причитаются" - таким способом,
в частности, передаются подпрограмме реакции при структурном переходе
сведения о типе ситуации.
Как уже было сказано, сегмент команд может быть вызван только как
подрограмма. Точка входа единственная - через его начало. Однако внутри
сегмента команд могут быть свои собственные локальные подпрограммы. Для
чего среди команд внутрисегментного перехода, условных и безусловных,
есть и переход к подпрограмме. Локальная подпрограмма ущербна - регистр
состояния процессора при её вызове не загружается; непосредственных
операндов ей не причитается; получить её адрес и как-то манипулировать с
ним (как с селектором сегмента команд), например передать в качестве
параметра другой подпрограмме - невозможно. Однако локальная
подпрограмма на равне с глобальной может служить реакцией при
структурном переходе. Для этого ловушки (и команды их установки) бывают
двух типов. (Даже трех - еще ловушка с нулевой реакцией.)
7. Система прерываний - векторная. Таблица векторов располагается в
начале оперативной памяти. Вектор включает два селектора: селектор
сегмента, которому надо передать управление в результате прерывания, и
селектор сегмента "сообщения", содержащего некоторые дополнительные
сведения. (В процессе прерывания устройство может передать блок данных -
"сообщение". Сегмент сообщения - место, куда оно будет помещено.)
В результате прерывания происходит переключение процессов. Запросы на
внешние прерывания рассматриваются только если в слове состояния
процессора сброшен признак запрета прерывания. Тоесть текущий процесс
разрешает приостановить своё выполнение. Внутренние прерывания
обрабатываются всегда. В более старших моделях признак запрета
прерывания состоит из нескольких (до 4) бит и называется "приоритетом" -
показывает "важность" текущего процесса. Запрос на прерывание от
внешнего источника рассматривается, если его приоритет больше текущего.
Если первый селектор вектора указывает на заголовок процесса - этот
процесс активируется, а текущий процесс, соответственно,
приостанавливается. Сегмент "сообщения" замещает аналогичный
прямодоступный сегмент процесса и в нем порождается ситуация. Однако это
происходит только если в слове состояния (которое, если процесс не
активен, сохранено в его заголовке) установлен признак приема
прерывания. Иначе требование прерывания отвергается. (Устройство будет
требовать его снова.)
Если первый селектор вектора указывает сегмент команд - на стэках
текущего процесса порождается временный процесс. Его задача - быстренько
выполнить необходимые действия и закончиться. Так ведут себя работающие
по прерыванмям драйверы различных устройств.
При активации процесса в результате прерывания признак, разрешающий
прием прерывания, автоматически сбрасывается. Он автоматически
устанавливается при деактивации процесса командой ожидания прерывания
("wait"), или может быть установлен/сброшен по желанию программы.
Переключение процессов происходит: в результате прерывания, при
выполнении текущим процессом команд ожидания прерывания и приостановки,
а так же при передаче управления не подпрограмме, а заголовку другого
процесса. Во всех случаях, кроме прерывания, процесс получивший
управление, выполняется с того места, где был приостановлен. Во всех
случаях, кроме выполнения команды ожидания прерывания, процесс,
потерявший управление, ставится в конец очереди процессов, претендующих
на процессорное время. При выполнении команд ожидания и приостановки
активируется первый процесс из этой очереди. Очередь поддерживается
содержищимися в заголовках процессов указателями на следующий процесс.
Начало и конец очереди обозначаются первым и вторым селекторами нулевого
вектора прерывания. Так что команда приостановки эквивалентна прерыванию
по нулевому вектору. Команда ожидания отличается от нее тем, что при её
выполнении счетчик команд не изменяется и после активации она будет
выполняться снова. Вывести процесс из этого состояния может только
возникновение в нем ситуации.
8. Особенности модели А4.01. Это самая младшая модель и поэтому у
неё отсутствуют наименее существенные элементы архитектуры. Аппаратные
средства минимальны в ущерб производительности.
- Оба стэка располагаются непосредственно в памяти; отсутствуют
регистровые устройства для удержания в процессоре верхушки стэка и
сведений о последних обращениях к сегментам.
- Физическое адресное пространство и объем ОЗУ всего 4К - сдвиг
селектора относительно смещения - 0 бит.
- В сегменте команд отсутствует слово, загружающееся в регистр
состояния процессора. Вместо этого при вызове подпрограммы признаки
устанавливаются в состояния по умолчанию. У подпрограммы не может быть
непосредственных операндов. Однако команда доступа к ним сохраняется.
- Нет "прямодоступных" сегментов, точнее говоря нет команд доступа к
ним. Однако второй компонент вектора ("сообщение") в заголовок процесса
всётаки загружается и может быть извлечено оттуда. Прием сообщения от
устройства требующего прерывание не поддерживается.
- Набор команд включает меньше 128 штук, следовательно в команде
нулевыми будут не четыре а пять старших бит.
- Кроме оперативной памяти имеется всего два физических сегмента, через
один из которых доступны все внешние устройства; а через второй - ПЗУ
начального пуска.
- Нет средств указания уровня вложенности записи активации.
Следовательно не поддерживаются переменные с промежуточными уровнями
локальности.
- Нет команд, работающих с очередью процессов - эти действия
производятся программным путем.
Ф4