95135

Контроллер прерываний для шины PCI

Контрольная

Коммуникация, связь, радиоэлектроника и цифровые приборы

Автоконфигурирование устройств выбор запросов прерывания каналов DMA поддерживается средствами BIOS материнской платы по образу и подобию стандарта Plug Play. Возможны самые разнообразные прерывания по самым различным причинам.

Русский

2015-09-20

522 KB

0 чел.

Министерство образования РФ

Марийский государственный технический университет

Факультет информатики и вычислительной техники

Кафедра ИВС

             «Контроллер прерываний для шины PCI»

Пояснительная записка

к расчётно-графической работе по дисциплине

«Периферийные устройства»

Разработали: Комаров С.Н. ВМ-51

Ковенков А.В. ВМ-51

Консультировал(а): Васяева Н.С.

Оценка

Йошкар-Ола, 2005г.

Содержание

Введение

PCI

PCI (Peripheral Component Interconnect bus) - шина для подсоединения периферийных устройств. Стала массово применяться для Pentium-систем, но используется и с 486 процессорами. Частота шины от 20 до 33 МГц, теоретически максимальная скорость 132/264 Мбайт/с для 32/64 бит. В современных материнских платах частота на шине PCI задается как 1/2 входной частоты процессора, т.е при частоте 66 MHz на PCI будет 33 MHz, при 75 MHz - 37.5 MHz.

Имеет версии с питанием 5V, 3.3V и универсальную (с переключением линий +VI/O c 5V на 3,3V). Ключами являются пропущенные ряды контактов 12, 13 и 50, 51. Для слота с питанием 5V ключ расположен на месте контактов 50, 51, для 3,3 В - 12, 13, а для универсального - два ключа: 12, 13 и 50,51. 32-битный слот заканчивается контактами А62/В62, 64-битный - А94/В94.

Слот PCI самодостаточен для подключения любого контроллера (VLB не работала без ISA), на системной плате может сосуществовать с любой из других шин ввода-вывода. Шина PCI - первая шина в архитектуре IBM PC, которая не привязана к этой архитектуре. Она является процессорно-независимой и применяется, например, в компьютерах Macintosh. В отличие от остальных шин, компоненты расположены на левой поверхности плат PCI-адаптеров. По этой причине крайний PCI-слот обычно разделяет использование посадочного места с соседним ISA-слотом (Shared slot).

Процессор через так называемые мосты (PCI Bridge) может быть подключен к нескольким каналам PCI, обеспечивая возможность одновременной передачи данных между независимыми каналами PCI (возможно только в спецификации 2.1).

Автоконфигурирование устройств (выбор запросов прерывания, каналов DMA) поддерживается средствами BIOS материнской платы по образу и подобию стандарта Plug & Play. В настоящее время действует спецификация PCI 2.1.

Стандарт PCI определяет для каждого слота конфигурационное пространство размером до 256 восьмибитных регистров, не приписанных ни к пространству памяти, ни к пространству ввода-вывода. Доступ к ним осуществляется по специальным циклам шины Configuration Read и Configuration Write, вырабатываемым контроллером при обращении процессора к регистрам контроллера шины PCI, расположенным в его пространстве ввода-вывода.

На PCI определены два основных вида устройств - инициатор (по ГОСТ - задатчик), т.е. устройство, получившее от арбитра шины разрешение на захват ее и устройство назначения, цель (target) с которым инициатор выполняет цикл обмена данными.

В мае 1999 года появилась спецификация 2.2 стандарта PCI и в это же время фирма Intel выпустила первый chipset с поддержкой версии 2.2 - i810. Поддержка версии 2.2 также появилась в некоторых платах на наборе 440BX. В соответствии с новой спецификацией появились следующие новые возможности:

Поддержка "горячей" замены PCI устройств, называемой в стандарте как PCI Hot-Plug. Ввод этой функции позволит добавлять/изымать PCI платы без выключения компьютера. Такая возможность особенно необходима для серверных платформ

Система управления энергопотреблением для устройств на шине PCI. Позволяет управлять энергопотреблением как для внешних PCI плат так и для встроенных на материнской плате устройств. Механизм управления подстроен под стандарт ACPI для облегчения управления энергопотреблением PCI устройств со стороны операционной системы.

Дополнены и переработаны требования к конструктивной реализации PCI плат.

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

Механизм прерываний.

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

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

Программы могут сами вызывать прерывания с заданным номером. Для этого они используют команду INT. Это так называемые программные прерывания. Программные прерывания не являются асинхронными, так как вызываются из программы (а она-то знает, когда она вызывает прерывание!).

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

Аппаратные прерывания вызываются физическими устройствами и приходят асинхронно. Эти прерывания информируют систему о событиях, связанных с работой устройств.

Использование прерываний при работе с медленными внешними устройствами позволяют совместить ввод/вывод с обработкой данных в центральном процессоре и в результате повышает общую производительность системы.

Некоторые прерывания (первые пять в порядке номеров) зарезервированы для использования самим центральным процессором на случай каких-либо особых событий вроде попытки деления на ноль, переполнения и т.п.

Иногда желательно сделать систему нечувствительной ко всем или отдельным прерываниям. Для этого используют так называемое маскирование прерываний, о котором мы еще будем подробно говорить. Но некоторые прерывания замаскировать нельзя, это немаскируемые прерывания.

Заметим еще, что обработчики прерываний могут сами вызывать программные прерывания, например, для получения доступа к сервису BIOS или DOS (сервис BIOS также доступен через механизм программных прерываний).

Аппаратные прерывания в PC-совместимых компьютерах

Аппаратные прерывания обеспечивают реакцию процессора на события, происходящие асинхронно по отношению к исполняемому программному коду. Аппаратные прерывания делятся на маскируемые и немаскируемые. Процессор x86 по сигналу прерывания приостанавливает выполнение текущего потока инструкций, сохраняя в стеке состояние (флаги и адрес возврата), и выполняет процедуру обработки прерывания. Конкретная процедура обработки выбирается из таблицы прерываний по вектору прерывания — однобайтному номеру элемента в данной таблице. Вектор прерывания доводится до процессора разными способами: для немаскируемого прерывания он фиксирован, для маскируемых прерываний его сообщает специальный контроллер прерываний. Кроме аппаратных прерываний у процессоров x86 имеются также внутренние прерывания — исключения (exceptions), связанные с особыми случаями выполнения инструкций, и программные прерывания. Для исключений вектор определяется самим особым условием, и под исключения фирмой Intel зарезервированы первые 32 вектора (0–31 или 00–1Fh). В программных прерываниях номер вектора содержится в самой инструкции (программные прерывания — это лишь специфический способ вызова процедур по номеру, с предварительным сохранением в стеке регистра флагов). Все эти прерывания используют один и тот же набор из 256 возможных векторов. Исторически сложилось так, что векторы, используемые для аппаратных прерываний, пересекаются с векторами исключений и векторами для программных прерываний, используемых для вызовов сервисов BIOS и DOS. Таким образом, для ряда номеров векторов процедура, на которую ссылается таблица прерываний, должна в начале содержать программный код, определяющий, по какому поводу она вызвана: из-за исключения, аппаратного прерывания или же для вызова какого-то системного сервиса. Таким образом, процедура, собственно и обеспечивающая реакцию процессора на то самое асинхронное событие, будет вызвана только после ряда действий по идентификации источника прерываний. Один и тот же вектор прерывания может использоваться и несколькими периферийными устройствами — это так называемое

разделяемое использование прерываний, которое подробно обсуждается ниже.

Вызов процедуры обслуживания прерываний в реальном и защищенном режимах процессора существенно различается:

● в реальном режиме таблица прерываний содержит 4-байтные дальние указатели (сегмент и смещение) на соответствующие процедуры, которые вызываются дальним вызовом (Call Far с предварительным сохранением флагов). Размер (256 Ч 4 байт) и положение таблицы (начинается с адреса 0) фиксированы;

● в защищенном режиме (и в его частном случае — режиме V86) таблица содержит 8-байтные дескрипторы прерываний, которые могут быть шлюзами прерываний (Interrupt Gate), ловушек (Trap Gate) или задач (Task Gate). Размер таблицы может быть уменьшен (максимальный — 256 Ч 8 байт), положение таблицы может меняться (определяется содержимым регистра IDT процессора). Код обработчика прерываний должен быть не менее привилегированным, чем код прерываемой задачи (иначе сработает исключение защиты). По этой причине обработчики прерываний должны работать на уровне ядра ОС (на нулевом уровне привилегий). Смена уровня привилегии при вызове обработчика приводит к дополнительным затратам времени на переопределение стека. Прерывания, вызывающие переключение задач (через Task Gate), расходуют значительное время на переключение контекста — выгрузку регистров процессора в сегмент состояния старой задачи и их загрузку из сегмента состояния новой.

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

На немаскируемое прерывание (NMI — Non-Maskable Interrrupt) процессор реагирует всегда (если обслуживание предыдущего NMI завершено); этому прерыванию соответствует фиксированный вектор 2. Немаскируемые прерывания в PC используются для сигнализации о фатальных аппаратных ошибках. Сигнал на линию NMI приходит от схем контроля памяти (четности или ECC), от линий контроля

шины ISA (IOCHK) и шины PCI (SERR#). Сигнал NMI блокируется до входа процессора установкой в 1 бита 7 порта 070h, отдельные источники разрешаются и идентифицируются битами порта 061h:

● бит 2 R/W — ERP — разрешение контроля ОЗУ и сигнала SERR# шины PCI;

● бит 3 R/W — EIC — разрешение контроля шины ISA;

● бит 6 R — IOCHK — ошибка контроля на шине ISA (сигнал IOCHK#);

● бит 7 R — PCK — ошибка четности ОЗУ или сигнал SERR# на шине PCI.

Реакция процессора на маскируемые прерывания может быть задержана сбросом его внутреннего флага IF (инструкция CLI запрещает прерывания, STI — разрешает). Маскируемые прерывания используются для сигнализации о событиях в устройствах. По возникновении события, требующего реакции, адаптер (контроллер) устройства формирует запрос прерывания, который поступает на вход контроллера прерываний. Задача контроллера прерываний — довести до процессора запрос прерывания и сообщить вектор, по которому выбирается программная процедура обработки прерываний.

Процедура обработки прерывания от устройства должна выполнить действия по обслуживанию данного устройства, включая сброс его запроса для обеспечения возможности реакции на следующие события, и послать команды завершения в контроллер прерываний. Вызывая процедуру обработки, процессор автоматически сохраняет в стеке значение всех флагов и сбрасывает флаг IF, что запрещает маскируемые прерывания. При возврате из этой процедуры (по инструкции IRET) процессор восстанавливает сохраненные флаги, в том числе и установленный (до прерывания) IF, что снова разрешает прерывания. Если во время работы обработчика прерываний требуется реакция на иные прерывания (более приоритетные), то в обработчике должна присутствовать инструкция STI. Особенно это касается длинных обработчиков; здесь инструкция STI должна вводиться как можно раньше, сразу после критической (не допускающей прерываний) секции. Следующие прерывания того же или более низкого уровня приоритета контроллер прерываний будет обслуживать только после получения команды завершения прерывания EOI (End Of Interrupt).

Описание сигналов шины PCI.

Для обработки данных, адресации, управления интерфейсом, арбитража и некоторых системных функций интерфейсу PCI требуется как минимум 47 выводов для целевого устройства и 49 выводов - для “управителя”. На рисунке 1 показаны функциональные группы выводов: слева указаны необходимые выводы, а справа - необязательные. Указание на рисунке направления сигналов подразумевает комбинацию ведущего/целевого устройства.

Рисунок 1: Список выводов PCI

Описание типов сигналов

Input - стандартный входной сигнал .

Totem Pole Output - стандартный активный драйвер.

Tri-State - это двунаправленный, с тремя состояниями, входной/выходной вывод.

Sustained Tri-State - подчиненный активный низкий сигнал с тремя состояниями, управляемый одним и только одним агентом в одно и то же времени. Агент, который управляет низким уровнем выводов s/t/s, должен сделать его “высоким” хотя бы один раз перед тем, как оставить в свободном состоянии. Новый агент не может начать управлять сигналом s/t/s, пока не пройдет один такт после того, как предыдущий “владелец” сигнала переведет его в свободное состояние. Повышение уровня требуется для поддержания неактивного состояния, пока другой агент не начнет управлять сигналом, что обеспечивается центральным ресурсом.

Open Drain - открытый коллектор - позволяет использовать количество устройств путем объединения их по “ИЛИ”.

Функциональные группы выводов

Описания выводов PCI объединены в функциональные группы, которые показаны на рисунке 1. Символ # в конце наименования сигнала показывает, что активное состояние сигнал имеет при низком уровне напряжения. Когда символ # отсутствует, сигнал активен при высоком уровне напряжения. Способ подачи сигнала, используемый для каждого вывода, показан после названия сигнала.

Системные выводы

CLK входной

Clock обеспечивает синхронизацию всех транзакций на PCI, а также является входным для каждого PCI - устройства. Все другие сигналы PCI, за исключением RST#, IRQ#, IRQB#, IRQC# и IRQD#, являются дискретными по фронту CLK, а другие временные параметры определяются относительно этой границы. PCI функционирует при частоте до 33 MHz, а в общем случае минимальная частота составляет 0 Гц.

RST# входной

Reset используется для приведения специфичных для PCI регистров, секвенсоров и сигналов к соответствующему состоянию. К какому же эффекту приводит сигнал RST# для устройства, если PCI-секвенсор не поддерживает спецификацию PCI, за исключением начальных состояний регистров, которые требуются для конфигурации PCI? В любое время, когда присутствует сигнал RST#, необходимо привести все выходные сигналы PCI в нужное состояние. В общем случае это означает, что они должны быть тристабильными. Далее изменяется сигнал SERR# (открытый коллектор). Сигналы SBO# и SDONE2 можно установить в логически низкий уровень при условии, что выходы с тремя состояниями не поддерживаются. Сигналы REQ# и GNT# оба должны быть тристабильными (во время сброса ими нельзя управлять по высокому или низкому уровню). Для предотвращения изменения сигналов AD, C/BE# и PAR центральное устройство может управлять этими линиями в течение инициализации шины, но только по логическому низкому уровню - по высокому уровню управление невозможно.

RST# может становиться активным или неактивным асинхронно по отношению к сигналу CLK. Несмотря на асинхронность, приведение сигнала в неактивное состояние гарантируется для “чистого” фронта, свободного от биений (искажений). За исключением случая, когда требуется доступ для конфигурации, после инициализации могут “откликаться” только те устройства, которым требуется перезагрузить систему.

Адресные выводы и выводы данных

AD[31::00] t/s

Адрес и данные мультиплексированы на одних и тех же выводах PCI. Транзакция шины состоит из фазы адреса , сопровождаемой одним или большим количеством фаз данных. PCI поддерживает как чтение блоками, так и запись. Фаза адреса - это временной цикл, в котором активен FRAME#. В течение фазы адреса в AD[31::00] содержится физический адрес (32 бита). При вводе-выводе это - адрес байта, для конфигурации и памяти это - адрес двойного слова (DWORD). Когда идут фазы данных, AD[07::00] содержит младший значащий байт (lsb), а в AD[31::24] содержится старший значащий байт(msb). Записываемые данные “устойчивы” и правильны, когда активен сигнал IRDY#, а читаемые данные “устойчивы” и правильны, когда активен TRDY#. Данные передаются во время активности сигналов IRDY# и TRDY#.

C/BE[3::0] t/s

Выводы Bus Command и Byte Enables (“команды шины и разрешение байта”) мультиплексированы на одних и тех же выводах PCI. Во время фазы адреса транзакции, C/BE[3::0]# определяет команду шины. В течение фазы данных C/BE[3::0]# используется в качестве Byte Enable. Byte Enable допустим для всей фазы данных и определяет, какие части байта несут значимые данные. C/BE[0]# применяется к байту 0 (lsb), а C/BE [3]# применяется к байту 3 (msb).

PAR t/s

Parity - это контроль по четности по линиям AD[31::00] и C/BE[3::0]#. Для Генерирование контрольного кода по четности требуется для всех агентов PCI. Сигнал PAR стабилен и допустим в течение одного такта после фазы адреса. Для фаз данных PAR стабилен и допустим в течение такта после того, как будет активен IRDY# - при транзакции записи, или TRDY# - при транзакции чтения. Если присутствует только сигнал PAR, то это остается в силе только в течение одного такта после завершения текущей фазы данных. (PAR имеет ту же самую синхронизацию, что и AD[31::00], но с задержкой на один такт). “Хозяин” шины управляет сигналом PAR для фаз адреса и фаз данных при записи; подчиненное же устройство управляет сигналом PAR для фаз данных при чтении.

Интерфейсные управляющие выводы

FRAME# s/t/s

Cycle Frame (циклический временной интервал) управляется текущим “управителем” для указания начала и продолжительности доступа. FRAME# становится активным, когда надо указать начало транзакции шины. Пока FRAME# активен, идет передача данных. Когда сигнал FRAME# становится неактивным, транзакция переходит в заключительную фазу данных.

IRDY# s/t/s

Initiator Ready (готовность инициализации) показывает способность агента инициализации (“управителя” шины) завершить текущую фазу транзакции данных. IRDY# используется вместе с TRDY#. Фаза данных завершается в любой момент времени, когда активны IRDY# и TRDY#. Во время записи, IRDY# показывает, что на линиях AD[31::00] присутствуют достоверные данные. При чтении это показывает, что мастер готов к приему данных. Циклы ожидания вставляются до тех пор, пока активны IRDY# и TRDY#.

TRDY# s/t/s

Target Ready (целевое устройство готово) показывает способность целевого агента (выбранного устройства) завершить текущую фазу данных транзакции. Сигнал TRDY# используется совместно с IRDY#. Фаза данных завершается в любом такте, когда активны оба сигнала TRDY# и IRDY#. При чтении TRDY# указывает, что на линиях AD[31::00] присутствуют достоверные данные. Во время записи это означает готовность целевого устройства к принятию данных. Циклы ожидания вставляются до тех пор, пока активны оба IRDY# и TRDY#.

STOP# s/t/s

Stop показывает, что текущее подчиненное устройство посылает “управителю” запрос на останов текущей транзакции.

LOCK# s/t/s

Lock показывает элементарную операцию, которой для завершения требуется множество транзакций. Неисключительные транзакции при активном LOCK# могут выполняться с адресом, который в текущий момент не блокирован. Разрешение исполнения транзакции на шине PCI не гарантирует контроля над LOCK#. Контроль над LOCK# можно получить в его собственном протоколе и при наличии GNT#. В то время, как единственный мастер монопольно управляет выводом LOCK#, возможно использование шины PCI различными агентами. Если устройство реализует исполняющую память (Executable Memory), то оно также должно установить LOCK# и гарантировать полное исключение доступа в этой памяти. Целевое устройство для доступа, поддерживающее LOCK#, должно обеспечить исключение минимум 16 байтов (с учетом выравнивания). Для главных интерфейсов, находящихся после системной памяти, также необходимо выполнить LOCK#.

IDSEL входной

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

DEVSEL# s/t/s

Когда активным выводом Device Select (выбор устройства) управляют, он показывает, что управляющее устройство дешифрировало данный адрес как цель текущего доступа. DEVSEL# в качестве входа показывает, было ли выбрано на шине какое-то устройство.

Выводы для сообщения об ошибках

Выводы для сообщения об ошибках требуются5 всем устройствам:

PERR# s/t/s

Вывод Parity Error (ошибка контроля по четности) предназначен только для сообщения об ошибках контроля по четности во время всех транзакций PCI, за исключением специального цикла (Special Cycle). Вывод PERR# - три-стабильный и должен активно управляться агентом, получающим данные в течение двух тактов, после того, как обнаружена ошибка контроля данных по четности. Минимальная продолжительность PERR# - один такт для любой фазы данных, у которой обнаружена ошибка контроля данных по четности (если идут последовательно несколько фаз данных, каждая из которых имеет ошибку контроля данных по четности, то сигнал PERR# будет установлен за более, чем один такт). PERR# должен быть установлен в высокое состояние за один такт прежде, перед тем, как он перейдет в третье состояние со всеми соответствующими тристабильными сигналами. Не существует никаких специальных условий для случая, когда теряется ошибка контроля данных по четности или сообщается об отсроченной ошибке. Агент не может установить PERR#, пока он не разрешил доступ, установив DEVSEL# и завершив фазу данных.

SERR# o/d

System Error предназначен для выдачи сообщений об ошибках контроля по четности для адреса, по команде Special Cycle (специальный цикл), или любых других системных ошибках, когда результаты могут оказаться катастрофическими. Если агенту не требуется генерирование немаскируемого прерывания (NMI), то необходим механизм для сообщения о разных событиях. SERR# представляет собой открытый коллектор и управляется в течение единственного такта PCI, когда агент сообщает об ошибке. Установление SERR# синхронизировано во времени, при этом требуется время на установку и “замораживание” всех сигналов на шине. Однако установка SERR# в неактивное состояние происходит при небольшом повышении уровня напряжения (до той же величины, что и для тристабильных сигналов), и это должно обеспечиваться системным разработчиком, а не агентом или центральным ресурсом. Такое повышение напряжения может занимать от двух до трех временных интервалов до полного восстановления SERR#. Агент, который посылает операционной системе сигналы SERR#, делает это в любой момент времени, когда установлен сигнал SERR#.

Выводы прерывания (необязательно)

Прерывания на PCI произвольны и определяются как “чувствительные к уровню”, т.е. устанавливаются по низкому уровню (отрицательное “истинно”), при этом для устройств используется выход с открытым коллектором. Переход сигналов INTx# в активное состояние и обратно асинхронно по отношению к CLK. PCI предусматривает одну линию прерываний для устройства с одной функцией, и до четырех линий прерывания - для многофункциональных6 устройств или соединителя. Для одно-функционального устройства может использоваться только линия INTA#, в то время как три других линий прерывания не имеют никакого значения.

INTA# o/d Interrupt A - используется для запроса прерывания.

INTB# o/d Interrupt B - используется для запроса прерывания и имеет значение только для многофункционального устройства.

INTC# o/d Interrupt C - используется для запроса прерывания и имеет значение только для многофункционального устройства.

INTD# o/d Interrupt D - используется для запроса прерывания и имеет значение только для многофункционального устройства.

Любая функция на многофункциональном устройстве может быть соединена с любой линией INTx#. Регистр вывода прерывания определяет, какая из линий INTx# используется для запроса прерывания. Если устройство реализует единственную линию INTx#, то она называется INTA#; если реализуются две строки, то они называются INTA# и INTB#; и т.д. Все функции многофункционального устройства могут использовать одну и ту же линию INTx#, либо каждая функция может иметь собственную линию (по максимальному количеству функций), либо любую комбинацию такого набора. Одна и та же функция не может генерировать прерывание более, чем на одной линии INTx#.

Поставщик системы свободен в выборе способа объединения различных сигналов INTx# из разъема PCI, для их соединения с контроллером прерываний. Они могут быть объединены по “ИЛИ”, либо переключаться электроникой под управлением программы, либо как-то иначе, путем комбинации вышеперечисленных способов. Это означает, что драйвер устройства не может делать какие-то “предположения” относительно совместного использования прерываний. Все драйверы PCI - устройств должны обладать способностью к совместному использованию прерываний (цепочек прерываний) с любым другим логическим устройством, включая устройства в этом же самом многофункциональном модуле.

Циклы шины

По сигналам C/BE (от C/BE3 до C/BE0) во время фазы передачи адреса определяется тип цикла передачи данных.

C/BE  

Команда

0000

Interrupt Acknowledge (подтверждение прерывания)

0001

Special Cycle (специальный цикл)  

0010

I/O Read (чтение порта)  

0011

I/O Write (запись в порт)  

0100

reserved (резервировано)

0101

reserved (резервировано)

0110

Memory Read (чтение памяти)  

0111

Memory Write (запись в память)

1000

reserved (резервировано)

1001

reserved (резервировано)

1010

Configuration Read (чтение конфигурации)

1011

Configuration Write (запись конфигурации)  

1100

Multiple Memory Read (множественное чтение памяти)  

1101

Dual Address Cycle (двойной цикл адреса)  

1110

Memory-Read Line (чтение памяти)

1111

Memory Write and Invalidate (запись в память и проверка)

Подтверждение прерывания (0000)

Контроллер прерываний автоматически распознает сигнал INTA и реагирует на него передачей вектора прерывания по шине AD.

Специальный цикл (0001)

AD15-AD0

Описание

0x0000

Processor Shutdown (процессор прекращает работу)  

0x0001

Processor Halt (останов процессора)  

0x0002

x86 Specific Code (специальный код для машин на архитектуре Intel x86)  

0x0003

to 0xFFFF  Reserved (зарезервировано)  

Чтение порта (0010) и запись в порт (0011)

Порты ввода/вывода на шине PCI могут быть 8 или 16-ти разрядными, хотя собственно стандарт на шину PCI позволяет иметь 32-х разрядное адресное пространство. Это вызвано тем, что на компьютерах с архитектурой Intel x86, адрес порта может иметь не более 16 разрядов. Пока и 16-ти разрядный адрес порта не может быть использован, так как карты на шине ISA могут декодировать только 10 разрядов.

Адресное пространство конфигурации доступно по адресам портов 0x0CF8 (Адрес) и 0x0CFC (Данные), причем адрес должен быть записан первым.

Чтение памяти (0110) и запись в память (0111)

По шинам AD передается адрес двойным словом (четыре байта). Сигналы AD0 и AD1 декодировать не требуется. Истинность данных определяется сигналами C/BE.

Чтение конфигурации (1010) и запись конфигурационных данных (1011)

Эти операции выполняются для конфигурационного пространства PCI карты. Размер области конфигурации составляет 256 байт, причем читать/записывать в нее можно только в 32-х разрядной сетке, т.е. двойными словами. Поэтому AD0 и AD1 должны быть установлены в 0, AD2-7 содержать адрес двойного слова, AD8-10 используются для выбора адресуемого устройства, а оставшиеся шины адреса игнорируются.

Примечания:

Unit ID - идентификационный номер устройства

Manufacturer ID - идентификатор производителя устройства

Status - состояние

Class Code - код класса устройства

BIST - Built-In Self Test - встроенный тест

 

Множественное чтение памяти (1100)

Это расширение обычного цикла чтения памяти. Используется для чтения больших блоков памяти без кэширования.

Двойной цикл адреса (1101)

Двойной цикл адреса необходим в том случае, если необходимо передать 64-х разрядный адрес в версии PCI с 32-х разрядной адресной сетке. В первом цикле передаются четыре младших байта адреса, затем четыре старших байта. Во втором цикле необходимо также передать команду, определяющую тип устройства, чей адрес выставлен (порт ввода/вывода, память и т.д.). Собственно PCI поддерживает 64 разряда адреса для портов ввода/вывода, но в PC на процессорах архитектуры от Intel такое адресное пространство не поддерживается (не позволяет сам процессор).

Временные диаграммы шины PCI

Цикл передачи данных на PCI, включает 4 фазы передачи данных, без тактов ожидания. Данные передаются по переднему фронту сигнала CLK.

Цикл передачи данных на PCI включает 3 фазы передачи данных с тактами ожидания. Данные передаются по переднему фронту сигнала CLK.

Традиционный контроллер прерываний 

Контроллер прерываний 8259A является периферийным устройством, которое связано с процессором через системную шину. По этой шине процессор может обращаться к регистрам контроллера, программируя его режимы и управляя им, а также получать от контроллера 8-битный вектор прерывания, для чего в интерфейсе системной шины процессора имеется специальная команда подтверждения прерывания (INTA). Контроллер 8259A имеет 8 входов запросов от источников и один выход общего запроса. Каждому из входов соответствует свой вектор; программированием регистров контроллера задается номер вектора для входа 0, остальным входам соответствуют последующие номера векторов. Каждый вход может быть программно замаскирован — тогда он не будет вызывать сигнал общего запроса. Контроллер занимает два адреса в пространстве ввода/вывода, программное

обращение по этим адресам обеспечивает выполнение следующих функций:

● управление режимами работы контроллера;

● управление приоритетами и масками запросов;

● идентификацию запросов прерывания без вырабатывания общего запроса — обслуживание прерываний по опросу (полинг).

В контроллере имеется три регистра: IRR, IMR и ISR. С каждым входом запроса в контроллере связано по одному биту каждого из этих регистров; бит 0 каждого из этих регистров относится к входу 0, бит 1 — к входу 1, бит 7 — ко входу 7. Регистры имеют следующие назначения:

● IRR (Interrupt Request Register) — регистр запросов прерываний, в котором бит устанавливается при обнаружении сигнала прерывания на соответствующем входе, независимо от маски;

● IMR (Interrupt Mask Register) — регистр масок прерываний. Единичное значение бита означает замаскированность данного входа — по запросу с замаскированного входа общий запрос прерывания не генерируется;

● ISR (Interrupt Service Register) — регистр обслуживаемого прерывания. Во время цикла подтверждения (INTA) в регистре устанавливается бит, соответствующий наиболее приоритетному запросу и, соответственно, формируемому вектору прерывания. В этот же момент обнуляется соответствующий бит запроса в регистре IRR. Бит в ISR обнуляется по получении контроллером команды EOI, а в режиме автоматического подтверждения (по команде AEOI) он обнуляется сразу после передачи вектора прерывания.

Контроллер прерываний позволяет программировать свои входы на чувствительность

к уровню или перепаду сигнала:

● чувствительность к уровню (level sensitive) означает, что контроллер прерываний вырабатывает запрос прерывания процессора по факту обнаружения определенного уровня на входе IRQx. Если к моменту завершения обработки этого запроса (после записи команды EOI в регистр контроллера прерываний) контроллер снова обнаруживает активный уровень на том же входе DRQx, то он снова сформирует запрос на прерывание процессора;

● чувствительность к перепаду (edge sensitive) означает, что контроллер прерываний вырабатывает запрос прерывания процессора только по факту обнаружения перепада (на ISA — положительного) на входе IRQx. Повторно запрос по этому входу возможен только по следующему такому же перепаду, то есть сигнал предварительно должен вернуться в исходное состояние.

В любом случае сигнал запроса аппаратного прерывания IRQx должен удерживаться генерирующей его схемой, по крайней мере, до цикла подтверждения прерывания процессором — именно в этот момент контроллер определяет самый приоритетный незамаскированный запрос и по нему формирует вектор. Если к этому моменту запрос будет снят, источник прерывания корректно идентифицирован не будет и контроллер сообщит ложный вектор прерывания (spurious interrupt), соответствующий его входу с максимальным номером (IRQ7 для первого контроллера и IRQ15 для второго). Обычно периферийные устройства строят так, что сигнал запроса сбрасывается при обращении программы обслуживания прерывания к соответствующим регистрам адаптера, так что ложных прерываний возникать не должно.

Один контроллер 8259A позволяет обслуживать 8 запросов прерываний; в PC/AT применяется каскадное соединение двух контроллеров, один из которых является ведущим, другой — ведомым. Ведущий контроллер 8259A#1 обслуживает запросы 0, 1, 3–7; его выход подключается к входу запроса прерываний процессора. К его входу 2 подключен ведомый контроллер 8259A#2, который обслуживает запросы 8–15. При этом поддерживается вложенность приоритетов — запросы 8–15 со своим рядом

убывающих приоритетов вклиниваются между запросами 1 и 3 ведущего контроллера, приоритеты запросов которого также убывают с ростом номера. В XT каскадирование не применялось и один контроллер 8259A обслуживал все 8 линий запросов.

Контроллер 8259A позволяет работать с запросами в различных режимах:

● Fully Nested Mode — режим полной вложенности приоритетов; каждому входу (уровню) запросов назначается свой приоритет (самый приоритетный — вход 0). В момент подтверждения прерывания контроллер устанавливает в регистре ISR бит, соответствующий самому приоритетному запросу на данный момент (и переданному вектору прерывания), и до его сброса игнорирует последующие запросы

с данного входа и менее приоритетные запросы;

● Special Fully Nested Mode — специальный режим полной вложенности, используемый в ведущем контроллере при каскадном соединении. В этом режиме ведущий контроллер не блокирует запрос от входа, к которому подключен ведомый контроллер. Это позволяет ведомому контроллеру сигнализировать о запросе, более приоритетном, чем предыдущий. В конце процедуры обработки

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

то ведущий контроллер снова подаст общий запрос прерывания, и на его подтверждение ведомый пошлет соответствующий вектор. Упоминаний о проверке на 0 значения ISR вторичного контроллера до подачи EOI первичному применительно к PC автору не встречалось. Очевидно, что в ней нет необходимости, если не используется ротация приоритетов: если у вторичного контроллера есть

еще не обслуженные запросы, то они будут обслужены в соответствии со своим приоритетом (до IRQ3…IRQ7);

● Automatic Rotation Mode — режим автоматической ротации приоритетов позволяет организовать равноприоритетное обслуживание всех запросов. В этом режиме уровень, запрос от которого пошел на обслуживание, получает низший приоритет. Ротация приоритетов организуется подачей команд OCW2 с кодом операции 101 или 100 (см. далее);

● Specific Rotation Mode — режим специфицированной ротации: командой OCW2 с кодом операции 111 или 110 указанному уровню устанавливается низший приоритет;

● Poll Mode — режим опроса, в котором общий запрос INTR не вырабатывается. По команде Poll, посылаемой через OCW3, контроллер фиксирует самый приоритетный запрос. Последующее считывание из регистра контроллера даст байт, в котором бит 7 указывает на наличие запроса, а в битах [2:0] содержится номер самого приоритетного запроса;

● Normal EOI — нормальный режим завершения, в котором бит ISR сбрасывается явной командой EOI, посылаемой контроллеру в конце исполнения обработчика прерывания. Обычно используется команда неспецифического EOI (код 20h), по которой сбрасывается бит ISR, соответствующий самому приоритетному из обслуживаемых запросов. Возможна команда и специфического EOI, которая сбрасывает в ISR бит, указанный в данной команде. Бит для замаскированного запроса таким способом сброшен быть не может;

● Auto EOI — автоматическая генерация неспецифического EOI контроллером в конце цикла подтверждения прерывания. Этот режим применим лишь в случаях, когда не требуется поддержка вложенности прерываний, и только для ведущего контроллера.

Контроллер 8259A своими 8-битными регистрами приписывается к пространству ввода/вывода и занимает 2 смежных адреса. Обмен с регистрами контроллеров должен производиться только однобайтными операциями ввода/вывода. В современных PC-совместимых компьютерах контроллеры имеют и дополнительные регистры (ELCR). Положение регистров в пространстве ввода/вывода приведено в табл. 1.

Контроллер имеет два режима работы: режим инициализации и операционный. После сброса контроллер инициализируется последовательностью команд ICW1–ICW4 (Initialization Command Words) длиной до 4 байт, после чего переходит в операционный режим. В операционном режиме (Operation Mode)контроллер воспринимает команды управления OCW1–OCW3 (Operation Control Words). В операционном режиме он может быть и реинициализирован, признаком начала инициализации является единичное значение бита 4 в байте, записываемом по адресу020h (0A0h). Назначение команд и регистров контроллера рерываний приведено ниже:

Команда инициализации ICW1 (запись по адресу 020h или 0A0h) служит для конфигурирования контроллера:

● биты [7:5]: 0 (в PC не используются);

● бит 4:1 — признак команды инициализации (в командах управления он нулевой);

● бит 3 — чувствительность линий запроса: 0 — прерывание по перепаду, 1 — прерывание по уровню. В современных контроллерах игнорируется, в них используется отдельный регистр ELCR, управляющий чувствительностью каждого из входов;

● бит 2 = 0 (в PC не используется);

● бит 1:0 — каскадное включение пары контроллеров, 1 — одиночный контроллер;

● бит 0:1 — признак использования ICW4.

Команда инициализации ICW2 (запись по адресу 021h или 0A1h) задает номер вектора, генерируемого данным контроллером для входа 0. Биты [2:0] должны иметь нулевые значения.

Команда инициализации ICW3 (запись по адресу 021h или 0A1h) используется только для каскадного включения:

● для ведущего контроллера (Master, 8259A#1) биты [0:7] указывают на наличие ведомых контроллеров на линиях IRQ0– IRQ7 соответственно. В AT ICW3 = 04h (ведомый на IRQ2);

● для ведомого контроллера (Slave, 8259A#2) биты [2:0] содержат номер входа ведущего контроллера, к которому он подключен, биты [7:3] сброшены. В AT ICW3 = 02h (подключен к IRQ2 ведущего).

Команда инициализации ICW4 (запись по адресу 021h или 0A1h) задает режим работы контроллера, его применение обязательно при начальной инициализации:

● биты [7:5]: 0 — не используются;

● бит 4 — SFNM (Special Fully Nested Mode): 1 — специальный режим полной вложенности разрешен, 0 — запрещен;

● бит 3 — BUF (Buffered): 1 — признак буферизованности шины;

● бит 2 — M/S (Master/Slave), положение в каскаде: 1 — ведущий, 0 — ведомый. В современных контроллерах не используется (сброшен);

● бит 1 — AEOI (Auto End Of Interrupt): 1 — разрешение автоматического завершения прерывания, 0 — нормальный режим (требует подачи EOI);

● бит 0 — тип используемого процессора: 1 — 8086/8088 и далее, 0 — 8080.

Команда управления OCW1 (запись по адресу 021h или 0A1h) задает маски запросов, единичное значение бита означает маскирование запроса. Биты [0:7]определяют маски запросов для IRQ0– IRQ7 (8259#1) или IRQ8– IRQ15 (8259#2).

Команда управления OCW2 (запись по адресу 020h или 0A0h) — завершение обслуживания прерывания (команда EOI), управление приоритетом:

● биты [7:5] задают код операции (в операциях, помеченных звездочкой, используется поле LLL в битах 2–0):

● 001 — неспецифический EOI;

● 011* — специфический EOI для запроса LLL;

● 101 — неспецифический EOI с ротацией приоритета;

● 100 — установка ротации приоритета в режиме AEOI;

● 000 — сброс ротации приоритета в режиме AEOI;

● 111* — специфический EOI с ротацией приоритета (установкой низшего приоритета для заданного уровня);

● 110* — установка низшего приоритета для заданного уровня;

● 010 — нет операции.

● биты [4:3]: 00 — признак OCW2;

● биты [2:0] — поле LLL — номер уровня, к которому относится команда (только для команд, помеченных звездочкой).

Команда управления OCW3 (запись по адресу 020h или 0A0h) — оперативное управление контроллером:

● бит 7:0 — не используется;

● биты [6:5] — режим специального маскирования (в PC не используется): 11 — установить, 10 — сбросить, 00, 01 — не изменять;

● биты [4:3]: 01 — признак OCW3;

● бит 2 — признак команды опроса (полинга). После команды полинга на последующую команду чтения порта 020h или 0A0h контроллер ответит байтом, кодирующим запрос прерывания с максимальным приоритетом. Для PC полинг обычно не используется (бит 2 — нулевой), а контроллер передает вектор прерывания по команде INTA;

● биты [1:0] — управление чтением регистров при операциях ввода по адресу 020h или 0A0h:

     ● 10 — чтение IRR — регистра запросов;

     ● 11 — чтение ISR — регистра обслуживаемого прерывания;

     ● 00, 01 — не изменять выбор регистра.

Регистры ELCR, имеющиеся в современных компьютерах, позволяют селективно управлять чувствительностью входов. В этих регистрах каждый бит отвечает за режим своего входа запроса: 0 — чувствительность к положительному перепаду, 1 — чувствительность к высокому уровню. Для входов IRQ0, 1, 2, 8 и 13 (таймер, клавиатура, вторичный контроллер прерываний, часы и исключение сопроцессора), допускается чувствительность только к перепаду (соответствующие биты должны быть нулевыми, но чипсет может их и игнорировать). Линии запросов прерывания от PCI по пути ко входам инвертируются, так как на них запрос сигнализируется низким уровнем.

В IBM PC/XT/AT используется специальный режим вложенных прерываний с фиксированным приоритетом и автоматическим неспецифическим завершением; типовые байты инициализации и управления приведены в табл. 2. После инициализации (процедурой POST и при загрузке ОС) все неиспользуемые входы контроллеров замаскированы (на запросы прерываний реагировать не будут), а их векторы прерываний указывают на «заглушку» — процедуру с единственной инструкцией IRET. Для подключения обработчика прерывания от устройства первым делом следует загрузить обработчик в память и установить указатель на него в таблице прерываний. Далее следует размаскировать соответствующий ему вход в контроллере прерываний, для чего выполняется чтение регистра маски (адрес 21h для 8259A#1, A1h для 8259A#2), обнуление соответствующего бита (см. табл. 4.) и запись в регистр нового значения маски. Если обработчик прерывания удаляется из памяти, предварительно должен быть замаскирован соответствующий ему вход контроллера. Все изменения в таблице прерываний должны выполняться при замаскированных прерываниях, чтобы избежать попытки использования вектора в процессе его модификации (это приведет к «вылету» программы — вызову по

некорректному адресу).

Каждая процедура обработки аппаратного прерывания должна завершаться командой неспецифического EOI — посылкой OCW2 = 20h контроллеру:

● для запросов от ведущего контроллера — посылка байта 20h по адресу 20h;

● для запросов от ведомого контроллера — посылка байта 20h по адресу A0h (EOI для ведомого контроллера); затем посылка байта 20h по адресу 20h (EOI для ведущего контроллера).

Некорректно завершенная процедура не позволит повторно использовать данный или другие запросы прерываний. Заметим, что команды EOI, как и инструкция IRET, в современных ОС включены в общий обработчик прерывания. В прикладных обработчиках (в драйверах устройств) этих команд быть не должно, иначе ОС не сможет собрать цепочку обработчиков разделяемого прерывания. В среде MSDOS

команды EOI и инструкцию IRET должен подавать прикладной обработчик.

На современных системных платах функции контроллеров прерываний возлагаются на чипсет, который может иметь и более гибкие возможности управления, чем пара контроллеров 8259A. Процедура инициализации контроллеров может и отличаться от традиционной, но ею занимается тест POST, который «знает» особенности системной платы. Однако в операционном режиме всегда сохраняется программная совместимость с 8259A.

Контроллер прерываний 8259А

Важное значение при построении ПЭВМ имеют специализированные ИМС системной поддержки. К последним относятся различные вспомогательные ИМС, например микросхемы тактовых и задающих генераторов, таймеры и др., а также БИС контроллеров, используемые для управления прерываниями, памятью, ПДП, шинами, периферией и т. п. Данные микросхемы, как правило, входят в состав определенных микропроцессорных комплектов ИМС. Как и МП, они претерпели несколько характерных этапов развития (см. § 3.1). Специализированные ИМС системной поддержки для ПЭВМ в настоящее время производят несколько десятков фирм в мире.

Однако большинство данных микросхем в структурном плане базируется на исходных «простых» ИМС фирмы 1п1е1.

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

Ниже (в порядке роста сложности ИМС) приводятся данные по некоторым типам специализированных микросхем, выпускаемых фирмой 1п1е1.

Микросхема 8259А представляет собой программируемый контроллер прерываний и используется в микропроцессорных системах для выполнения до 8 приоритетных векторных прерываний в ЦП. При каскадировании возможно расширение до 64 прерываний без использования дополнительных ИМС. В табл. 3. приведено назначение выводов ИМС 8259А.

Табл. 3. Назначение выводов ИМС 8259А

Номер вывода

Тип вывода

Обозначение|

Назначение

1

Вход

CS

Выбор ИМС

2

Вход

WR

Запись

3

Вход

RD

Считывание

4.. .11

Вход/выход

D7...D0

Шина данных

12, 13, 15

Вход/выход

CAS0...CAS2

Шина каскадирования

16

Вход/выход

SP/EN

Вход программирования подчиненности/выход запрета для шины данных

17

Выход

INT

Прерывания

18.. .25

Вход

IR0...IR7

Запрос прерывания

26

Вход

INTA

Подтверждение прерывания

27

Вход

A0

Адрес

28

Vcc

Питание + 5 В

14

GND

Общий (схемная земля)

В структурной схеме ИМС 8259А (рис. 2.) можно выделить следующие блоки: блок управления, буфер данных, блок чтения-записи, каскадный буфер-компаратор, блок приоритетов, регистр обслуживания прерываний, регистр запроса прерываний, регистр маскирования прерываний. Буфер данных производит обмен информацией с системной шиной. Блок чтения-записи осуществляет прием команд ЦП, хранение начальных и операционных командных слов и выдачу информации о состоянии контроллера прерываний в шину данных. Каскадный буфер-компаратор предоставляет возможность расширения числа обрабатываемых запросов прерываний путем хранения и сравнения идентификаторов всех контроллеров, используемых в вычислительной системе. Регистр запроса прерываний фиксирует входные запросы и вместе с блоком приоритетов разрешает немаскируемым запросам с достаточным приоритетом сформировать сигнал единицы на выходе ШТ. Блок приоритетов определяет приоритеты запросов в регистре прерываний, а регистр обслуживания прерываний предназначен для хранения текущих обрабатываемых запросов.

Традиционная схема формирования запросов прерываний

Традиционная схема формирования запросов прерываний с использованием пары PIC изображена на рис. 3.

На входы контроллеров прерываний поступают запросы от системных устройств (клавиатура, системный таймер, CMOS-таймер, сопроцессор), периферийных контроллеров системной платы и карт расширения. Традиционно все линии запросов, не занятые перечисленными устройствами, присутствуют на всех слотах шины ISA/EISA. Эти линии обозначаются как IRQx и имеют общепринятое назначение (табл. 4.). Часть этих линий отдается в распоряжение шины PCI. В таблице отражены и приоритеты прерываний — запросы расположены в порядке их убывания. Номера векторов, соответствующих линиям запросов контроллеров, система приоритетов и некоторые другие параметры задаются программно при инициализации контроллеров. Эти основные настройки остаются традиционными для обеспечения совместимости с программным обеспечением, но различаются для ОС реального и защищенного режимов. Так, например, в ОС Windows базовые векторы для ведущего и ведомого контроллеров — 50h и 58h соответственно.

Каждому устройству, для поддержки работы которого требуются прерывания, должен быть назначен свой номер прерывания. Назначения номеров прерываний выполняются с двух сторон: во-первых, адаптер, нуждающийся в прерываниях, должен быть сконфигурирован на использование конкретной линии шины (джамперами или программно). Во-вторых, программное обеспечение, поддерживающее данный адаптер, должно быть проинформировано о номере используемого вектора. В процессе назначения прерываний может участвовать система PnP для шин ISA и PCI, для распределения линий запросов между шинами служат специальные параметры CMOS Setup. Современные ОС имеют возможность изменить назначение запросов относительно распределения, сделанного через CMOS Setup. После того как произведено конфигурирование системы прерываний (проинициализирован контроллер прерываний, устройствам назначены линии запросов и установлены указатели на процедуры обработки), отработка маскируемых аппаратных прерываний происходит следующим образом:

● устройство по событию прерывания возбуждает назначенную ему линию запроса прерывания;

● контроллер принимает сигналы запросов от источников прерываний (сигналы IRQx) и при наличии незамаскированного запроса подает сигнал общего запроса прерывания (сигнал INTR) процессору x86;

● процессор, реагируя на запрос (когда прерывания флагом IF разрешены), сохраняет в стеке содержимое регистра флагов и адрес возврата, после чего формирует шинный цикл INTA (Interrupt Acknowledge, подтверждение прерывания), который доводится до контроллера прерываний;

● в момент получения сигнала INTA контроллер прерываний фиксирует состояние своих входов запросов - к этому моменту их состояние могло измениться: могли появиться новые запросы или пропасть запрос от «нетерпеливого» устройства. Контроллер анализирует поступившие запросы в соответствии с запрограммированной схемой приоритетов и посылает процессору вектор прерывания, соответствующий самому приоритетному незамаскированному запросу, присутствующему на входе контроллера в момент подачи шинной команды INTA. При этом контроллер выполняет и некоторые действия в соответствии с

установленной приоритетной политикой, учитывающие, какой именно вектор был послан (какой из запросов пошел на обслуживание);

● получив вектор прерывания, процессор по его номеру вызывает соответствующую процедуру обработки прерывания. Если данный вектор прерывания используется не только для аппаратных прерываний, но и для исключений и/или программных прерываний, то процедура в первую очередь должна определить, к какому из этих типов относится данное событие. Для этого процедура может обратиться к контроллеру (прочитать регистр ISR) и проанализировать состояние регистров процессора. Дальнейшие шаги рассматриваются для случая, когда обнаружено аппаратное прерывание;

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

● процедура должна обслужить устройство-источник прерывания — выполнить «полезные» действия, связанные с событием, о котором и сигнализировало устройство. Это обслуживание должно обеспечить и снятие сигнала запроса прерывания от данного устройства. В случае разделяемых прерываний источников может быть и несколько, и все они требуют обслуживания;

● если обработка прерывания занимает значительное время, в течение которого требуется реакция системы на более приоритетные запросы, то после критической секции в обработчик включают инструкцию STI, устанавливающую флаг разрешения прерываний (IF) в процессоре. С этого момента возможны вложенные прерывания, прерывающие работу данного обработчика другой, более приоритетной процедурой;

● процедура обработки прерывания должна послать контроллеру команду завершения обработки прерывания EOI (End Of Interrupt), по которой контроллер разрешит последующий прием сигнала с обслуженного входа и менее приоритетных. Это должно быть сделано после снятия сигнала прерывания от обслуженных устройств, иначе контроллер после EOI пошлет повторный запрос. Обработчик прерывания, для которого запрос поступил от ведомого контроллера, должен послать EOI как ведомому, так и ведущему контроллеру. Участок обработчика, начинающийся от подачи команды EOI до завершения (инструкции IRET), должен быть непрерываемым, то есть он является критической секцией.

Если обработчик разрешал вложенные прерывания, то перед подачей команды EOI должна присутствовать инструкция CLI, запрещающая прерывания;

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

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

Традиционные прерывания PCI 

Для устройств PCI выделяется четыре проводных линии запросов (IRQX, IRQY, IRQZ, IRQW), соединяемых с контактами INTA#, INTB#, INTC# и INTD# всех слотов PCI с циклическим смещением цепей (см. рис. 4). Соответствие линий INTx# и входов IRQ для устройства любой шины PCI приведено в табл. 5. Мосты PCI просто электрически соединяют одноименные линии INTx своих первичных и вторичных шин. В системах с APIC, в которых число входов запросов увеличено до 24, дополнительные

8 входов могут использоваться периферийными устройствами, установленными на системной плате. На слотах PCI остаются доступными лишь четыре обычные линии запросов.

Устройство PCI вводит сигнал прерывания низким уровнем (выходом с открытым коллектором или стоком) на выбранную линию INTx#. Этот сигнал должен удерживаться до тех пор, пока программный драйвер, вызванный по прерыванию, не сбросит запрос прерывания, обратившись по шине к данному устройству. Если после этого контроллер прерываний снова обнаруживает низкий уровень на линии

запроса, это означает, что запрос на ту же линию ввело другое устройство, разделяющее данную линию с первым, и оно тоже требует обслуживания.

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

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

Каждая функция устройства PCI может задействовать свою линию запроса прерывания, но его обработчик прерывания должен быть готовым к ее разделению (совместному использованию) с другими устройствами. Если устройству требуется только одна линия запроса, то оно должно занимать линию INTA#, если две - INTA# и INTB#, и т. д. С учетом циклического сдвига линий запроса это правило позволяет установить в 4 соседних слота 4 простых устройства, и каждое из них будет занимать отдельную линию запроса прерывания. Если какой-то карте требуется 2 линии, то для монопольного использования прерываний нужно оставить соседний слот свободным. Однако не следует забывать, что PCI-устройства системной платы тоже задействуют прерывания с той же закономерностью (кроме

контроллера IDE, который, к счастью, держится особняком). Порт AGP в плане прерываний следует рассматривать наравне со слотом PCI. Таким образом, может оказаться, что монопольные линии прерывания присутствуют далеко не на всех слотах.

Назначение прерываний устройствам (функциям) выполняет процедура POST, и этот процесс управляем лишь частично. Параметрами CMOS Setup (PCI/PNP Configuration) пользователь определяет номера запросов прерываний, доступных шине PCI. В зависимости от версии BIOS это может выглядеть по-разному: либо каждой линии INTA#...INTD# явно назначается свой номер, либо ряд номеров отдается

«на откуп» устройствам PCI вместе с устройствами ISA PnP (в противоположность устройствам «Legacy ISA»). В итоге POST определяет соответствие линий INTA#...INTD# номерам запросов контроллера и соответствующим образом программирует коммутатор запросов. По воле пользователя может оказаться так, что не каждой линии запроса шины PCI достается отдельный вход контроллера прерываний. Тогда коммутатор организует объединение нескольких линий запросов PCI на один вход контроллера, то есть разделяемыми станут даже разные линии запросов прерываний для PCI. В самом худшем случае устройствам PCI не достанется ни одного входа контроллера прерываний. Заметим, что BIOS вряд ли

отдаст шине PCI прерывания 14 и 15 (их забирает контроллер IDE, если он не отключен), а также 3 и 4 (COM-порты). Новые версии ОС настолько сильно вникают в аппаратную платформу, что позволяют себе (зная чипсет системной платы или пользуясь функциями PCI BIOS) управлять коммутатором запросов прерываний. Эту возможность можно запретить или разрешить, например, в ОС Windows снятием или установкой флажка Использовать управление IRQ (PCI Interrupt Steering) в свойствах шины PCI (Панель управления_Системные устройства_Шина PCI).

Драйвер (или иное ПО), работающий с устройством PCI, определяет номер входа контроллера прерывания, доставшийся устройству (точнее, функции), чтением конфигурационного регистра Interrupt Line. По этому номеру определяется вектор (см. табл. 3.1), значение 255 означает, что номер не назначен. Номер входа каждому устройству заносит тест POST. Для этого он считывает регистр Interrupt

Pin каждой обнаруженной функции и по номеру устройства (читай: географическому адресу!) определяет, какая из линий INTA#...INTD# (на входе коммутатора запросов) используется. Заметим, что правила, по которым на системной плате определяется соответствие между Interrupt Pin и входными линиями коммутатора запросов в зависимости от номера устройства, строго не регламентированы (деление номера устройства на 4 — это всего лишь рекомендация), но их твердо знает версия BIOS данной системной платы. К этому моменту тест POST уже определил таблицу соответствия этих линий номерам входов; пользуясь этой таблицей, он записывает нужное значение в конфигурационный регистр Interrupt Line. Определить, есть ли еще претенденты на тот же номер прерывания, можно, лишь просмотрев конфигурационные регистры функций всех устройств, обнаруженных на шине (это не так уж сложно сделать, пользуясь функциями PCI BIOS).

В PCI BIOS начиная с версии 2.1 имеются функции определения возможностей и конфигурирования прерываний. Одна из функций возвращает структуру данных, в которой для каждого устройства (на каждой шине) сообщается, с какими входами контроллера прерываний (IRQx) могут быть связаны его линии INTx и с каким именно связаны в данный момент. Также указывается и физический номер слота, в который установлено данное устройство. Кроме того, возвращается и битовая карта, показывающая, какие входы IRQx отводятся исключительно шине PCI (и не используются абонентами других шин). Функция установки для заданного устройства устанавливает связь выбранного сигнала (INTx) с выбранным входом контроллера прерываний (IRQx), то есть программирует коммутатор. Эта функция предназначена для использования только конфигурационным ПО (BIOS, ОС), но никак не драйвером устройства. Тот, кто ею пользуется, сам отвечает за возможные конфликты, за правильное программирование контроллера прерываний (выбранный вход должен быть чувствительным к низкому уровню, а не положительному перепаду), за корректировку информации в конфигурационном пространстве всех затронутых устройств (у которых линии запроса связаны с выбранной линией INTx).

Заключение

В результате проделанной работы была спроектирована схема контроллера прерывания шины PCI, включающая в себя:

1. Шина PCI

Двунаправленная

Разрядность шины PCI: ША=32,ШД=32

Режимы работы:

а) чтение и запись в порт

б) чтение и запись в память

в) подтверждение прерываний

2. Число устройств – 4

3. Коммутатор запросов

4. Контроллер прерывания – ИМС 8259А

Литература

  1.  Спецификация локальной шины PCI, реализация 2.0, 30 апреля 1993 г.
  2.  Спецификация локальной шины PCI, реализация 2.2, май 1999 г.
  3.  Михаил Гук «Шины PCI, USB и FireWire. Энциклопедия», Питер, 2003 г.
  4.  Роберт Журден "Справочник программиста на компьютере фирмы IBM".
  5.  www.krinc.ru  (ресурс разработчика устройств для PCI)
  6.  www.pcisig.com (ресурс консорциума PCI)
  7.  www.spline.ru (ресурс, содержащий документацию по PCI)
  8.  www.lib.csu.ru/dl/bases/prg/frolov/books/bsp/v02/ch8.htm (информация по контроллеру 8259)
  9.  www.vvk2.mpei.ac.ru/kat/MPSystems/lection10.htm (управление приоритетами прерывания)
  10.  www.compitech.ru/html.cgi/arhiv_s/00_01/stat_55.htm (Самый простой интерфейс для PCI)
  11.  www.masterkit.ru (сайт радиолюбителей)

Приложение


 

А также другие работы, которые могут Вас заинтересовать

28861. Становление правовой науки в Российском государстве 99.5 KB
  Однако собственно теории права тогда еще не было. Все теоретическое знание о праве формировалось в рамках самостоятельной дисциплины – философии права. Последняя исследовала не столько теоретические основы позитивного права сколько право каким оно должно быть с точки зрения тех или иных идеальных критериев т. имело своим предметом то что исторически получило название естественного права.
28862. Учения о государстве и праве в Украине в 19первой половине 20 ст. 72 KB
  Философия права Панфила Юркевича. Что же касается собственно проблем осмысления и развития права то в силу приоритетности вопросов национальногосударственного самоопределения они оказываются на периферии внимания крупных ученых. Концептуальное значение для понимания права и автономности личности в учении Сковороды имеют идея сродности и природного равенства людей.1 Философия права Панфила Юркевича.
28863. Современные учения о государстве и праве 75 KB
  Неопозитивистские теории права Ганс Кельзен Герберт Харт. Социологические теории права Евгений Эрлих Роско Паунд. Психологическая теория права Лев Петражицкий. Это обусловлено с одной стороны тем что природа права такова что оно пронизывает все сверы человеческой жизнедеятельности и отражает как явление сложные экономические политические и социальные отношения.
28864. Обґрунтування проблем права і держави у вченнях мислителів стародавнього Сходу та Греції (докласичний період) 79 KB
  1 Обґрунтування проблем права і держави у вченнях мислителів стародавнього Сходу та Греції докласичний період. Філософське споглядання проблем держави і права перших грецьких мислителів. Виведення права із суб’єктивних потреб людини у вченні софістів. питання: Причини що обумовлюють відмінність розвитку підходу до ідеї права і держави у народів Сходу та грецького народу: історичні об’єктивний та суб’єктивний напрямки у історії правової культури; психологічні що розкриваються у принципах: мінливості чуттєвих вражень сталості звички...
28865. Учения о государстве и праве в Древней Греции 42 KB
  Теоретическое исследование проблем государства и права в Античной греческой философии: общая характеристика Основу формирования теоретического мировозрения  философии и в том числе первых представлений о гос. В соответствии с такими представлениями в философских учениях Античной Греции можно выделить следующие характерные особенности в понимании государства и права: государство рассматривалось как абсолютное и самодостаточное существо  человек большого размера. Частные формы жизни имели смысл лишь с точки зрения их полезности и...
28866. Учения о праве и государстве периода классической греческой философии 92.5 KB
  Методологические основания учения о праве и государства Платона. Поскольку человек должен действовать в жизни в соответствии с идеей блага то и цель государства реализовать эту идею. Сущность же государства как общества разумных существ можно познать познав сущность человека. И три основные функции которые надлежит выполнять этим сословиям управленческою оборону государства удовлетворение основных потребностей людей.
28867. Предмет історії вчень про державу і право 29 KB
  В общем виде задача этой дисциплины может быть сформулирована следующим образом: познакомить студента с содержанием и историей наиболее значительных теоретических концепций государства и права прошлых эпох. они представляют собой материал необходимый как для выработки научно обоснованного описания закономерностей функционирования государства так и для правильного решения типичных проблем политического властвования и правового регулирования возникающих в современной государственной жизни в Украине. По своему содержанию он призван охватить во...
28868. Учения о государстве и праве елленистического и древнеримского периодов 62.5 KB
  Таким образом в понимании стоиками государства и права можно выделить следующие особенности: 1. В этом смысле закон рассматривается как закон природы источник справедливости и права. Для учения о праве характерно различение права и закона анализ форм права. В качестве основы права П.
28869. Государственно-правовые аспекты учений раннего христианства и средневековья 49.5 KB
  С политикоправовых позиций эти идеи не поддаются однозначной оценке поскольку отрицание государства в римском понимании и связынный с этим правовой нигилизм можно рассматривать как регресс по сравнению с развитой юридической мыслью с другой стороны в учении раннего христианства в первую очередь поддаавались критике те стороны общественной жизни которые требовали серьезного реформирования. В последствии в средневековье проблема взаимоотношения церкви и государства транформируется в основную идеологическую проблему. В последствии в Новое...