Жмакин А.П. Архитектура ЭВМ (2006) (1186252), страница 26
Текст из файла (страница 26)
Такой простой способ реализации векторных прерываний, с использованием уже существующего механизма вызова подпрограмм, был реализован, например, в микропроцессоре i8080 с контроллером прерываний 58259. Однако этот механизм, как, впрочем, и все остальное, допускает дальнейшее совершенствование.
Прежде всего, желание иметь возможность располагать подпрограммы в произвольной области памяти приводит к необходимости размещать в поле адреса команды вызова полноразрядный адрес (16— 20— 32 бита). В этом случае длина команды превышает длину машинного слова и ее ввод требует нескольких машинных циклов (например, в i8080 — трех), что увеличивает время реакции системы на запрос прерывания.
Для преодоления этого недостатка в систему команд процессора включают дополнительно "укороченные" команды вызова длиной в одно машинное слово. Эти команды в процессорах 8080 и *86 имеют мнемокод int. В микропроцессоре i8080 имеется 8 таких команд длиной в 1 байт, адресующих подпрограммы по фиксированным адресам памяти: OOOOh, 0008h, OOlOh, 0038h.
В процессорах xS6 имеется 256 вариантов двухбайтовых команд int ooh, int FFh, байт поля адреса которых (называемый вектором) после умножения на 4 указывает на четырехбайтовую структуру, определяющую произвольный адрес в адресном пространстве памяти.
Напомним, что доступ в память процессоров *86 (в реальном режиме) осуществляется только в рамках сегментов размером в 64 Кбайт. Положение начала сегмента в адресном пространстве памяти определяется содержимым 16-разрядного сегментного регистра, а положение адресуемого байта внутри сегмента— 16-разрядным смещением. Среди команд передачи управления различают короткие и длинные переходы (вызовы). При коротком вызове подпрограмма должна располагаться в текущем сегменте кода, и ее вызов сопровождается только изменением счетчика команд (в *86 он обозначается, как IP). При длинном вызове новое значение загружается как в IP, так и в сегментный регистр кода CS. Таким образом, для осуществления длинного вызова (перехода) в адресном поле команды необходимо разместить 4 байта.
Механизм векторных прерываний в процессорах *86 в реальном режиме реализован следующим образом. В начальных адресах OOOOOh,003FFh пространства памяти размещается таблица векторов прерываний объемом 1 Кбайт, включающая 256 строк таблицы — четырехбайтовых структур CS:IP, которые определяют адреса соответствующих обработчиков прерываний. В цикле обработки векторного прерывания (запрос по входу INT), процессор получает от источника байт — номер строки таблицы векторов прерываний, из которой и загружаются новые значения CS и IP. Старые значения CS:IP (адрес возврата) размещаются в стеке.
Запросу по радиальному входу NMI соответствует вектор 2, поэтому появление активного значения не вызывает машинного цикла обслуживания прерывания, а сразу вызывается обработчик по адресу из ячеек памяти 00008h, OOOOBh. Кстати, любой обработчик прерывания (независимо от значения маскирующих флагов) можно вызвать программно с помощью команды int пп, где пп — номер строки таблицы векторов прерываний.
Таким образом, команда int отличается от команды call, во-первых, способом адресации вызываемой подпрограммы (прямой адрес — в команде call, косвенный — в int), во-вторых, при реализации int в стек, помимо CS и IP, помещается содержимое регистра признаков процессора — FLAGS. Соответственно, завершаться подпрограмма, вызываемая командой int, должна командой iret ("возврат из прерывания"). Действие iret отличается от действия ret извлечением из стека дополнительного слова в регистр FLAGS.
6.3.4. Прямой доступ в память
В процессе работы МПС с интерфейсом типа "общая шина" часто возникает необходимость передачи достаточно больших массивов данных между памятью и ВУ (например, копирование сектора диска, загрузка видеопамяти и т. п.). При наличии в системе единственного активного устройства — процессора возможен единственный путь решения этой задачи— программно-управляемый обмен "Память -> Процессор -» ВУ" (или "ВУ -> Процессор -» Память").
Рассмотрим вариант программно-управляемого обмена между памятью и внешним устройством в МПС на базе МП i8080 [13]. Пусть необходимо передать массив данных длиной L, начиная с адреса ADR на ВУ с адресом АЮ. Положим, что начальный адрес массива загружен в регистровую пару HL, а длина массива — в регистр С. Тогда фрагмент программы обмена может иметь вид, представленный в табл. 6.2.
Таким образом, для того чтобы в рамках процедуры копирования массива данных переслать из памяти в ВУ один байт данных, потребуется десять машинных циклов. Процессоры с более совершенной системой команд (например, jc86) могут использовать для этой цели меньшее число МЦ, но все равно их будет более одного.
Управляя обменом, микропроцессор "ведет" два счетчика — адресов массива и количества переданных байтов и формирует на магистраль сигналы управления. Если снабдить ВУ аппаратными счетчиками и схемой формирования управляющих сигналов (т. н. "канал прямого доступа в память" — ПДП), то передачу одного байта (слова) можно осуществить за один МЦ без участия процессора. Необходимо лишь на время передачи данных под управлением канала ПДП блокировать работу процессора, отключив его от системной шины. Для этого служит вход захвата шины HLD. Если подать на него активный уровень, то МП по окончании текущего МЦ, безусловно, перейдет в режим ожидания, переведя все свои выходные линии, кроме HLDA, в высокоимпе-дансное состояние, а выход HLDA— в состояние логической 1. Выходной сигнал^ HLDA используется для отключения процессорного модуля от системной шины — перевода шинных формирователей, включенных между локальной и системной шиной, в высокоимпедансное состояние. Если в МПС используется несколько ВУ, снабженных каналом ПДП, то целесообразно использовать специальный контроллер ПДП, который обеспечивает программирование каналов ПДП, подключение их к системной шине и дисциплину обслуживания.
Глава 7
Эволюция архитектур микропроцессоров и микроЭВМ
В главе 6 была рассмотрена архитектура 16-разрядного микропроцессора i8086 и систем на его основе. Эту архитектуру мы (условно) будем считать базовой. Уже в ней по сравнению с первыми 8-разрядными системами (на базе i8080) реализован ряд новых архитектурных решений:
□ расширена система команд (по набору операций и способам адресации);
□ архитектура микропроцессора ориентирована на мультипроцессорную работу. Разработана группа вспомогательных БИС (контроллеров и специализированных процессоров) для организации мультимикропроцессорных систем различной конфигурации;
□ начато движение в сторону совмещения во времени выполнения различных операций. Микропроцессор включает два параллельно работающих устройства: обработки данных и связи с магистралью, что позволяет совместить во времени процессы обработки информации и передачи ее по магистрали;
□ введена новая (по сравнению с i8080) организация памяти, которая далее использовалась во всех старших моделях семейства Intel — сегментация памяти.
Можно сказать, что основная цель совершенствования микропроцессоров — это увеличение их производительности. Достигается эта цель различными путями: повышением тактовой частоты работы кристалла, совершенствованием операционных устройств (например, применение параллельного умножителя), организацией параллельной во времени работы нескольких устройств, совершенствованием системы команд (с ориентацией под конкретный класс задач), эффективной организацией иерархии памяти, опережающим выполнением ряда процедур командных циклов, организацией мультизадачных и мультипроцессорных систем и другими способами.
На примере микропроцессоров Intel линии 8080 ->• 8086 -» 80286 -> 80386 -> 80486 -> Pentium -»... -> Pentium 4 (это семейство принято обозначать как х86) можно проследить реализацию многих из перечисленных выше путей. Рассмотрим некоторые из них, не придерживаясь хронологической последовательности нововведений. Более подробные сведения о рассматриваемых в этой главе вопросах можно найти в [3, 11, 12, 14].
7.1. Защищенный режим и организация памяти
Первый шаг для увеличения производительности систем на базе процессоров х86 был сделан в направлении мультипроцессорной конфигурации. В 8086 предусмотрены два режима работы — минимальный и максимальный (см. разд. 6.1.1), причем последний ориентирован на организацию мультипроцессорных систем. Часть выводов микропроцессора в максимальном режиме вместо сигналов управления шиной передает коды внутренних состояний управляющего автомата; кроме того, в составе серии выпускались специализированные модули, которые обеспечивали доступ микропроцессора к системной шине — арбитраж шины.
Однако широкого распространения подобная архитектура не получила, поскольку при отсутствии на кристалле микропроцессора достаточно "вместительной" внутренней памяти процессоры постоянно ожидают в очереди на доступ к шине. Характерно, что в последующих моделях семейства— 80286, 80386, 80486 поддерживалась только однопроцессорная конфигурация, и лишь в Pentium вновь вернулись к возможности организации многопроцессорных систем.
7.1.1. Сегментная организация памяти
Как вы, очевидно, помните, в микропроцессоре 8086 в рамках адресного пространства объемом 1 Мбайт одновременно было доступно четыре сегмента по 64 Кбайт каждый.
В следующих моделях микропроцессоров семейства лг86' в рамках т. н. защищенного режима (protect mode, Р-режим) организовано линейное адресное
пространство объемом 2 байтов, в котором допускается создание практически любого числа сегментов.
Если в 8086 единственным атрибутом сегмента был его начальный адрес, то в Р-режиме старших моделей семейства х86 для описания многочисленных атрибутов предусмотрена специальная структура — дескриптор.
Дескриптор— это 8-байтовый блок, содержащий атрибуты области линейных адресов — сегмента. Дескриптор включает в себя информацию о положении сегмента в линейном адресном пространстве, размере сегмента, типе информации, хранящемся в сегменте и правах доступа к ней, а также другие атрибуты сегмента. Формат дескриптора представлен на рис. 7.1.
Назначение полей дескриптора:
□ базовый адрес1 [31:0] определяет место сегмента (начальный адрес) внутри 4-гигабайтного адресного пространства;
□ предел [19:0] определяет размер сегмента с учетом бита гранулярности (см. далее).
Поле атрибутов включает следующие признаки:
□ G — бит гранулярности. При значении G = 0 размер сегмента задается в байтах, а при G = 1 — в страницах по 4 Кбайт. В первом случае максимальный размер сегмента может достигать 1 Мбайт, во втором — 4 Гбайт;
□ D — бит размера по умолчанию (от англ. defaults size) обеспечивает совместимость с процессором 80286. При D = 0 находящиеся в сегменте операнды считаются имеющими размер 16 битов, иначе — 32 бита;
□ X — зарезервирован Intel и не должен использоваться программистом (содержит 0);
□ U— бит пользователя (от англ. user) предназначен для использования системным программистом. Процессор игнорирует этот бит.
Байт права доступа (AR) имеет несколько отличающуюся структуру для дескрипторов сегментов разных типов, но некоторые поля этого байта являются общими для всех дескрипторов:
□ Р — бит присутствия (от англ. present) сегмента, если Р = 0, то дескриптор не может использоваться, т. к. сегмент отсутствует в ОЗУ. При обращении к сегменту, дескриптор которого имеет Р = 0, формируется соответствующее прерывание;