Главная – Архитектура микропроцессоров

КомпьютерПресс №2 1991. И. Липкин

Архитектура микропроцессоров

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

Архитектура микропроцессоров

Режимы адресации

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

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

В случае нахождения операнда в ОЗУ, его адрес можно хранить в регистрах, причем в команде указывается, например, имя регистра, в котором находится адрес сегмента, а смещение дается в явном виде. Допускается хранение в регистрах и адреса сегмента, и смещения; при этом, в команде указываются только их имена. Подобный способ называется косвенной адресацией памяти. Он позволяет "находить" необходимые операнды с использованием комбинаций, в которых могут участвовать: базовый регистр, индексный регистр, базовый регистр+индексный регистр, базовый регистр+смещение, индексный регистр+смещение, базовый регистр+индексный регистр+смещение.

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

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

Режим виртуального адреса

В предыдущем выпуске мы рассмотрели режим реального адреса, позволяющий обращаться к ОЗУ объемом до одного мегабайта при ширине адресной шины процессора 80286 всего 16 разрядов. Но каждому, кто когда-либо брал в руки журналы по компьютерной технике, наверняка попадались на глаза статьи, в которых черным по белому было написано, что оперативная память PC/AT может иметь размеры четыре, а то и восемь мегабайт. Подобные цифры вызывают законное недоумение. Во-первых, непонятно, зачем персональному компьютеру такое ОЗУ, а во-вторых, каким образом им пользоваться, если для адресации одного только мегабайта приходится применять довольно хитроумный двухступенчатый способ.

На первый вопрос ответить сравнительно просто. Увеличение объема ОЗУ объясняется, в основном, возможностью применения на персональных компьютерах многозадачных операционных систем, работающих в режиме разделения времени - таких, как, например, OS/2 и UNIX. В двух словах принцип разделения времени состоит в следующем: время работы процессора искусственно квантуется таким образом, что в течение каждого кванта, составляющего долю секунды, выполняется "кусок" одной из программ, одновременно запущенных на компьютере; затем выполняется "кусок" из другой программы, и так далее. Разумеется, для хранения текстов программ, их данных и промежуточных результатов использовать такие сравнительно медленные запоминающие устройства, как жесткие диски, не имеет смысла - полностью теряется эффект одновременности выполнения сразу нескольких задач. Таким образом, увеличение пространства ОЗУ - вынужденная мера, направленная на повышение производительности компьютера.

Что же касается адресации оперативной памяти "за границей" одного мегабайта, то здесь разработчикам i286 помог принцип виртуальной организации памяти.

Как и в случае реального адреса, результирующий физический адрес памяти является суммой некоторой базы и смещения. Со смещением нам, в общем, уже все ясно, а вот базовый адрес определяется сложнее. Сегментный регистр содержит не само число, из которого путем добавления четырех нулей справа получается адрес сегмента, а некоторый идентификатор, называемый селектором. Он состоит из трех полей (см. рисунок), два из которых - индикатор TI и индекс - определяют адрес искомого сегмента по специальным таблицам, находящимся в ОЗУ. Каждый элемент любой из этих таблиц, называемый дескриптором, имеет длину 64 разряда, 24 из них отведены под базовый адрес, а остальные для нас пока интереса не представляют. Если при вычислении адреса индикатор селектора TI равен нулю, то процессор обращается к так называемой глобальной дескрипторной таблице, которая может использоваться всеми запущенными задачами. В противном случае (при TI = 1) используется одна из локальных дескрипторных таблиц. Дело в том, что если глобальная дескрипторная таблица (GDT) в системе всего одна, то локальная (LDT) - для каждой из задач своя. Сумма смещения и базового адреса, взятого из дескрипторной таблицы, дает в результате искомый физический адрес в ОЗУ (см. рисунок). Длина адреса в таком случае составляет целых 24 бита, а это позволяет обращаться уже к 16 Мбайтам оперативной памяти.

Преобразование адреса в виртуальном режиме
Рис.1. Преобразование адреса в виртуальном режиме. Увеличить рисунок

Итак, аппаратно-реализуемое адресное пространство i286 составляет 16 Мбайт, но стоит заметить, что длина индекса в селекторе равна 13 разрядам, а размер сегмента равен 216 байтам. Таким образом, каждая задача, используя свою LDT, получает адресное пространство 229 байт, а в сумме с областью, определяемой GDT, эта величина составляет 230 байт или 1 Гбайт.

Теперь у читателя может возникнуть вполне резонный вопрос: зачем так много? Ответим: для реализации многозадачного режима. При недостаточно больших размерах ОЗУ можно организовать доступ к внешним запоминающим устройствам, как к некой области виртуальной памяти. Тогда в ОЗУ достаточно держать лишь наиболее часто запрашиваемые сегменты задачи, а остальные "подкачивать" с жесткого диска по мере необходимости.

Прерывания

Часто возникают ситуации, когда вам необходимо ввести данные при помощи мыши или с клавиатуры, а процессор занят выполнением какой-то задачи. Как быть? Или другой пример: вечером вы спокойно работаете в опустевшем здании НИИ, а в это самое время ничего не подозревающий вахтер в целях пожарной безопасности обесточивает все помещения. Каким образом организовать работу процессора, чтобы он мог предпринимать какие-то действия в ответ на подобные внешние раздражители?

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

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

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

Посмотрим, что же происходит, когда IF = 1 и на вход INTR поступил сигнал прерывания. Сначала процессор приостанавливает выполнение текущей программы и запоминает промежуточные результаты в стеке, необходимые для восстановления статус кво. Затем он посылает устройству-возмутителю спокойствия запрос о причинах прерывания, В ответ может быть получено некоторое число в диапазоне от 0 до 255 - такое количество вариантов сообщения внешнего устройства разработчики предусмотрели для указания процессору, какие шаги следует предпринять в каждом конкретном случае. Число от 0 до 255 определяет тип прерывания, а инструкции о том, как процессору реагировать на тот или иной тип, содержатся в специальных программах, называемых процедурами прерываний. Адреса процедур находятся в специальной таблице, состоящей, как вы уже догадались, из 256 элементов, причем каждый элемент содержит соответствующие значения регистров IP и CS, Начальный адрес таблицы в ОЗУ - 0. По окончании процедуры прерывания процессор возвращает из стека промежуточные данные и продолжает выполнять прерванную программу с точки прерывания.

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

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

НомерРеальный режимВиртуальный режим
0Особый случай ошибки деленияОсобый случай ошибки деления
1Прерывание пошаговой работыПрерывание пошаговой работы
2Немаскируемое прерываниеНемаскируемое прерывание
3Контрольный остановКонтрольный останов
4Особый случай переполненияОсобый случай переполнения
5Особый случай превышения диапазонаОсобый случай превышения диапазона
6Особый случай недействительного кода операцииОсобый случай недействительного кода операции
7Особый случай отсутствия сопроцессораОсобый случай отсутствия сопроцессора
8Особый случай слишком малой IDTОсобый случай слишком малой IDT
9Особый случай превышения сегмента сопроцессоромПревышение сегмента сопроцессором
10ЗарезервированоНедействительный TSS
11ЗарезервированоОтсутствие сегмента
12ЗарезервированоОсобый случай стека
13Особый случай превышения сегментаОсобый случай защиты
14ЗарезервированоЗарезервировано
15ЗарезервированоЗарезервировано
16Особый случай сопроцессораОсобый случай сопроцессора
.  
.ЗарезервированыЗарезервированы
.  
31  
Зарезервированные прерывания

(Продолжение следует)

И. Липкин
КомпьютерПресс 2'91