Аппаратные интерфейсы ПК

         

Совместное использование прерываний


Линии запросов прерываний в компьютере, насыщенном дополнительными адап­терами, являются самым дефицитным ресурсом, поэтому возникает желание ис­пользовать эти линии совместно, то есть применять разделяемые прерывания меж­ду несколькими устройствами (shared interrupts). Обработчики прерываний (программы) от разных устройств, разделяющих одну линию запроса (и следова­тельно, общий вектор прерывания), должны быть выстроены в цепочку. В процес­се обработки прерывания очередной обработчик в цепочке чтением известного ему регистра своего устройства должен определить, не это ли устройство вызвало пре­рывание. Если это, то обработчик должен выполнить необходимые действия и сбросить сигнал запроса прерывания от своего устройства, после чего передать управление следующему обработчику в цепочке; в противном случае он просто передает управление следующему обработчику.

Разделяемые прерывания для разнотипных устройств в общем случае работо­способными считать нельзя. Во-первых, у каждого устройства факт прерывания программно обнаруживается по-своему, и этот способ знает только драйвер этого устройства. Так что программно для совместного использования прерываний их обработчики должны уметь выстраиваться в цепочки, что на практике выполня­ется не всегда корректно. Во-вторых, возможны потери прерываний от устройств, требующих быстрой реакции. Это может происходить, если обработчик такого устройства окажется в конце цепочки, а предшествующие ему обработчики окажут­ся «нерасторопными» (не самым быстрым способом обнаружат, что прерывание — не их). Поведение системы в такой ситуации может меняться в зависимости от порядка загрузки драйверов. Для нескольких однотипных устройств (например, сетевых адаптеров на одном и том же кристалле), пользующихся одним драйве­ром, разделяемые прерывания работают вполне успешно.

Чтобы прерывания, одновременно возникающие от нескольких устройств, не те­рялись, контроллер прерываний должен быть чувствительным к уровню, а не к перепаду на входе запроса.
В соответствие со схемотехникой логики ТТЛ и КМОП активным уровнем должен быть низкий; выходной формирователь сигнала запро­сов у адаптеров — с открытым коллектором (ТТЛ) илиоткрытым стоком (КМОП); вход запроса у контроллера должен быть «подтянут» к высокому уровню резисто­ром. Тогда непосредственное соединение этих выходов со входом контроллера («Монтажное И») даст требуемый результат в аппаратном плане, а в программном плане необходимо корректно выстроить обработчики в цепочку.

Поясним, почему надежное разделение прерываний при чувствительности к пе­репаду на линии запроса невозможно. Если устройство 1 выработает сигнал за­проса после того, как его выработает (но еще не снимет) устройство 2, то контрол­лер обработает только один запрос. Цепочка программных обработчиков окажется ненадежной: если обработчик устройства 1 в этой цепочке будет проверять свое

12.4. Прямой доступ к памяти — DMA '__________________________________ 463

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

Как уже говорилось, в шине ISA прерывание вырабатывается по положительному перепаду сигнала на линии запроса. Стандартный контроллер 8259А позволяет задавать чувствительность — уровень или перепад — только для всех входов од­новременно, поэтому разделяемые прерывания на шине ISA неработоспособны. Тем не менее некоторые чипсеты, реализующие контроллеры прерываний, допус­кают индивидуальное управление чувствительностью каждого входа. Тогда при соответствующих возможностях CMOS Setup, адаптеров и их ПО разделяемые прерывания технически реализуемы.

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


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

Если карта PCI использует одну линию запроса прерываний, то этой линией по умолчанию является INTR А. Если все четыре карты PCI используют по одной линии запроса, то, как это видно на рис. 12.1, каждая линия занимается монопольно. Однако если сложная карта нуждается в большем числе линий запроса, то ей придется разделять линии с соседними картами. На современных системных платах часто устанавливают более четырех слотов PCI, при этом, естественно, «угроза» совмест­ного использования линий запросов «нависает» и над картами с одной линией за­проса. Порт AGP в плане прерываний следует рассматривать наравне со слотами PCI.

Проявления конфликтов и ошибок назначения прерываний могут быть разнообраз­ными. Сетевая карта при ошибке в прерываниях не сможет принимать кадры из сети (при этом она может их успешно посылать). У устройств хранения доступ к дан­ным будет поразительно медленным (иногда можно минутами ожидать, например, появления информации о файлах и каталогах) или вообще невозможным. Звуко­вые карты будут молчать или «заикаться», на видеопроигрывателях изображение будет дергаться и так далее. Конфликты могут приводить и к внезапным переза­грузкам компьютера, например по приходу кадра из сети или сигналу от модема.


Содержание раздела