Доклад: Системное программирование
Другой не менее интересный момент заключается в том, что микропроцессор при принятии к обработке запроса на прерывание сбросил флаг IF в ноль, тем самым запретив все последующие аппаратные прерывания. Этим обстоятельством программист может пользоваться по своему усмотрению. Все запросы на прерывания с приоритетом, равным текущему или меньшим, будут запрещены в любом случае, - это обусловлено логикой работы контроллера i8259A. Поэтому программист должен решить, насколько его замыслам могут помешать запросы на более приоритетные прерывания. Если это некритично, то лучше сразу, в начале процедуры обработки прерывания установить флаг IF в единицу. В большинстве случаев этк операцию нужно делать как можно раньше. Для установки флага IF в единицу в системе команд микропроцессора есть спецальная команда, не имеющая операндов:
sti – разрешить аппаратные прерывания.
Наиболее наглядный пример, показывающий важность своевременной установки IF, связан с отсчетом времени. Рассмотрим, как ведется учет времени в компьютере. Как после включения компьютер определяет время текущее время суток или как он запоминает информацию о своей конфигурации после выключения? Все дело в том, что компьютер имеет небольшую энергонезависимую память, которая питается от аккумулятора и не зависит от подключения к электросети. Конструктивно эта память выполнена на специальном типе полупроводниковых элементов с так называемой CMOS-структурой (ComplementarMetalOxideSemiconductor – комплиментарная МОП - структура). Особенность таких элементов – в их пониженной по сравнению с обычными микросхемами потребляемой мощности (при этом они являются и более медленными, что в данном случае не отрицательно). Аккумулятор кроме CMOS-памяти питает еще и микросхему системных часов, в функции которой входит отсчет текущих даты и времени суток. Таким образом, текущие значения даты и времени постоянно хранятся в CMOS-памяти и поддерживаются в актуальном состоянии даже после выключения компьютера. Кроме того, в CMOS-памяти хранится некоторая другая информация, в частности, о конфигурации компьютера. Во время загрузки компьютера дата и время считываются в область данных BIOS. Дальнейший отсчет времени, после загрузки системы, ведется с помощью системного таймера – другой микросхемы на системной плате, в функции которой входит регулярно, примерно 18.2 раза в секунду, генерировать сигнал, который в качестве прерывания подается на уровень irq0 контролера прерываний i8259A. Во время работы компьютера соответствующая программа BIOSобрабатывает прерывание данного уровня и ведет счет времени. Если терять такты по этому входу, то фактическое время на часах будет отставать, и поэтому в большинстве случаев в обработчиках прерываний есть смысл, как можно раньше выдавать команду sti.
Обработка прерываний в реальном режиме
Характеристики реального режима работы микропроцессора
o Пространство оперативной памяти делится на сегменты по 64 Кбайт. Сегменты в памяти могут перекрываться;
o Страничное преобразование адреса запрещено, то есть физический адрес равен линейному и формируется как сумма двух составляющих:
· 16-разрядного эффективного адреса, который, в свою очередь, является суммой трех составляющих: базы, смещения и индекса;
· 20-разрядного результата сдвига содержимого конкретного сегментного регистра на 4 разряда влево;
o Максимальное значение физического адреса равно0ff fffh, то есть1 Мбайт, но, фактически, в реальном режиме микропроцессора адресуется на 64 Кбайт больше, что следует из следующего вычисления:
Ffff0 – максимальное значение сегментной части адреса, сдвинутое на 4 разряда влево;
+
0fffh – максимальное значение смещения;
10ffef – максимальный физический адрес в реальном режиме.
Этот пример говорит о том, что в модели микропроцессоров, начиная с i286, при определенных обстоятельствах возможна адресация оперативной памяти за пределами первого мегабайта. Это обстоятельство даже использовалось последними версиями MS-DOS для размещения служебных программ в этом дополнительном сегменте памяти. Формирование значений адреса сразу за первым мегабайтом возможно и в микропроцессоре i8088/86. в нем при появлении физического адреса большего 0ffffh, например 1 000 054h, микропроцессор отбрасывает 21-й единичный бит. Происходит так называемое «заворачивание» адреса, поэтому сформированный физический адрес на шине адреса будет равен 00054h. Для того чтобы обеспечить полную эмуляцию данной особенности микропроцессора i8088/86, в моделях микропроцессоров, начиная с i80286, была предусмотрена возможность блокировки адресной линии A20 (управление тем самым 21-м битом адреса). Для обеспечения доступа к адресам оперативной памяти, лежащим за пределами первого мегабайта, необходимо специальным образом открывать эту адресную линию;
o В реальном режиме схема распределения оперативной памяти – фиксированная. Перечислим расположение некоторых из системных областей, которые потребуются нам в дальнейшем:
· В диапазоне адресов 00000h – 003ffh (первый мегабайт оперативной памяти) находится таблица векторов прерываний (ТВП). Адрес программы прерывания наз. вектором. Она содержит 256 векторов прерываний размером 4 байта (указателей на программы обработки прерываний). В первом слове хранится значение ip, а во втором – cs. Младшие 1024 байт памяти содержат вектора прерываний, таким образом, имеется место для 256 векторов;
· В диапазоне адресов 00400h – 006ffh сразу за таблицей векторов прерываний располагается область памяти, содержащая жестко структурированные данные, обеспечивающие работу BIOS и MS-DOS;
· С адреса 0b8000h располагается область видеопамяти, в которой формируется изображение, которое мы видим на экране.
Общая схема обработки прерываний в реальном режиме
Обработка прерываний (как внешних, так и внутренних) в реальном режиме микропроцессора производится в три этапа:
1. Прекращение выполнения текущей программы.
2. Переход к выполнению и выполнение программы обработки прерываний.
3. Возврат управления прерванной программе.
Первый этап должен обеспечить временное прекращение выполнения текущей программы таким образом, чтобы потом прерванная программа продолжила свою работу так, как будто никакого прерывания не было. Любая программа, загруженная для выполнения операционной системой, занимает свое, отдельное от других программ, место в оперативной памяти. Разделяемыми между программами ресурсами являются регистры микропроцессоров, в том числе регистр флагов, поэтому их содержимое нужно сохранять. Обязательным для сохранения являются регистры cs, ip и flags \ eflags, поэтому они при возникновении прерывания сохраняются микропроцессором автоматически. Пара cs:ip содержит адрес команды, с которой необходимо начать выполнение после возврата из программы обслуживания прерывания, а flags \ eflags – состояние флагов после выполнения последней команды прерванной программы в момент передачи управления программе обработки прерывания. Сохранение содержимого остальных регистров должно обеспечиваться программистом в начале программы обработки прерывания до их использования. Наиболее удобным методом хранения регистров является стек. В конце первого этапа микропроцессор после включения в стек регистров flags, cs, i сбрасывает бит флага прерываний IF в регистре flags (но при этом в стек записывается предыдущее содержимое регистра flags с еще установленным IF). Тем самым предотвращаются возможность возникновения вложенных прерываний по входу INTR и порча регистров исходной программы вследствие неконтролируемых действий со стороны программы обработки вложенного прерывания. После того как необходимые действия по сохранению контекста завершены, обработчик аппаратного прерывания может разрешить вложенные прерывания командой sti.
Набор действий по реализации второго этапа заключается в определении источника прерывания и вызова соответствующей программы обработки. В реальном режиме микропроцессора допускается от 0 до 255 источников прерываний. Количество источников прерываний ограничено размером таблицы векторов прерываний. Эта таблица выступает связывающим звеном между источником прерывания и процедурой обработки. Данная таблица располагается в памяти, начиная с адреса 0. каждый элемент таблицы векторов прерываний занимает 4 байта и имеет следующую структуру:
o 1-е слово элемента таблицы – значение смещения начала процедуры обработки прерывания (n) от начала кодового сегмента;
o 2-е слово элемента таблицы – значение базового адреса сегмента, в котором находится процедура обработки прерывания.
Определить адрес, по которому находится вектор прерывания с номером n, можно следующим образом:
cмещение_элемента_таблицы_векторов_прерываний = n*4