Помощничек
Главная | Обратная связь


Археология
Архитектура
Астрономия
Аудит
Биология
Ботаника
Бухгалтерский учёт
Войное дело
Генетика
География
Геология
Дизайн
Искусство
История
Кино
Кулинария
Культура
Литература
Математика
Медицина
Металлургия
Мифология
Музыка
Психология
Религия
Спорт
Строительство
Техника
Транспорт
Туризм
Усадьба
Физика
Фотография
Химия
Экология
Электричество
Электроника
Энергетика

Проблема разделяемых прерываний



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

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

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

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

В первых версиях (до PCI 2.2 включительно) не было общепринятого способа программной индикации и запрета прерываний. К сожалению, в конфигураци­онных регистрах не нашлось стандартного места для бита, индицирующего вве­дение запроса прерывания данным устройством, — тогда бы в прерываниях для PCI не было бы проблем с унификацией разделяемых прерываний. В каждом устройстве для работы с прерываниями используются свои специфические биты операционных регистров, относящихся к пространству памяти или вво­да-вывода (иногда и к конфигурационному пространству). При этом опреде­лить, является ли данное устройство в текущий момент источником прерыва­ния, может только его обработчик прерывания (Interrupt Service Routine, ISR), входящий в драйвер данного устройства. Таким образом, у ОС нет иной воз­можности диспетчеризации разделяемых прерываний, кроме как выстроить их обработчики в цепочку. За расторопность и корректность ISR отвечает его раз­работчик. В PCI 2.3 наконец-то появился фиксированный бит (Interrupt Status) в регистре состояния конфигурационного пространства устройства (функции), по которому ОС может определить источник разделяемого прерывания и вы­звать только его ISR. Однако упоминание о поддержке PCI 2.3 в описаниях уст­ройств и операционных систем встречается нечасто.

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

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

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

 




Поиск по сайту:

©2015-2020 studopedya.ru Все права принадлежат авторам размещенных материалов.