Компьютер-Информ || Архив || Рубрики || Поиск || Подписка || Работа || О "КИ" || Карта

ЗАО "Техно-СПб" Системная интеграция

Шина PCI и разделяемые прерывания


Материал любезно предоставлен сайтом iXBT.com


Теория

По спецификации PCI для прерываний предусмотрены 4 контакта. Это значительно меньше, чем для ISA, где на 16-разрядной шине ≈ 11 входов запроса прерываний. Но дело в том, что прерывания на ISA и PCI √ это принципиально разные сигналы. На шине ISA прерывания срабатывают по принципу перепада из ╚0╩ в ╚1╩. Просто установленное значение ╚1╩ прерывания не вызовет. Поэтому, если одно устройство выставило сигнал, то другому устройству бесполезно выставлять на эту же линию ╚1╩ ≈ контроллер прерываний на нее не среагирует. Вследствие этого для ISA-шины закон прост: одно устройство ≈ одно прерывание.

На шине PCI выход запроса прерывания должен быть с открытым стоком (то же самое, что открытый коллектор в TTL). Несколько выходов разных устройств объединяются по схеме ╚проводного И╩, то есть их выходы просто соединяются вместе и если хотя бы на одном из них ╚0╩, то и на всей линии ╚0╩. Поэтому активный запрос прерывания на шине PCI ≈ ╚0╩. И контроллер прерываний должен реагировать не на перепад, а на уровень сигнала. Таким образом, если 2 устройства запросили прерывания по одной линии, то программа-обработчик должна сначала проверить, ее ли устройство вызвало прерывание, а затем обработать вызов (при этом устройство снимет запрос, но на линии останется ╚0╩ из-за второго устройства). Контроллер, отреагировав на логический ╚0╩, снова вызовет обработчик. Тот, проверив, что ╚его╩ устройство прерывания не требовало, вызовет второй обработчик. Он выполнит уже код, отвечающий за второе устройство (после чего на входе запроса прерывания наконец-то появится ╚1╩).
В PCI-устройстве должна существовать возможность определения источника прерывания. В спецификации PCI конкретно не указывается, каким образом эта возможность реализуется. Там только говорится о том, что все обработчики прерываний должны уметь работать с разделяемыми прерываниями и уметь выстраиваться в цепочку (Daisy chaining). Этот механизм используется программистами уже давно, и проблем никаких не вызывает. На известной старшему поколению ЭВМ ╚Электронике-60╩ и всех ее родственниках на разъеме реализовано вообще только одно прерывание. При подтверждении прерывания устройство выдает на шину вектор, в котором содержится стартовый адрес обработчика именно этого устройства. При этом централизованный контроллер прерываний, присущий для архитектуры PC, вообще отсутствует. На PCI-шине такой механизм легко реализуем, но для платформы х86 используется более традиционный способ ≈ радикальное назначение, когда конкретной линии запроса ставится в соответствие конкретный вектор, генерируемый контроллером прерываний.
Чтобы механизм Daisy chaining работал, достаточно в определенном программно-доступном регистре иметь флажок, повторяющий состояние запроса прерывания этого устройства, а лучше ≈ число необслуженных прерываний. Регистр с такими функциями может находиться и среди портов ввода-вывода (I/O), и даже быть ячейкой памяти. Этот регистр позволяет всем PCI-устройствам назначить всего лишь одно прерывание.

Зачем же тогда 4 линии запросов? Это ≈ запас для многофункциональных устройств. Например, плата Iomega BUZ содержит 2 совершенно независимых части ≈ устройство видеозахвата и Ultra SCSI-контроллер. Они могут использовать 2 отдельных запроса прерывания. Это позволяет нормально работать даже тогда, когда одна часть многофункционального устройства не поддерживается конкретной ОС. В случае Iomega BUZ видеоввод работает только под ОС Win9x, а SCSI-контроллер ≈ и под ОС WinNT.
В спецификации PCI 2.0 ничего не говорилось о конкретной реализации связи между устройствами на шине и контроллером прерываний. Поэтому на старых материнских платах с шиной PCI можно видеть конфигурационные перемычки (╚джамперы╩), позволяющие назначить любому устройству любое прерывание.
В следующей версии PCI 2.1 появился пример воплощения универсального механизма назначения прерываний. При этом линия Int A на первом разъеме PCI становится Int B на втором разъеме, Int C ≈ на третьем и Int D ≈ на четвертом. Остальные линии тоже сдвигаются на один контакт. Эти 4 провода идут на матричный коммутатор, который доводит их до свободных входов контроллера прерываний. Такой матричный коммутатор 4x4 являлся частью моста PCI-ISA всех чипсетов предпоследнего поколения, ≈ контроллер прерываний в архитектуре PC находится на шине ISA. Только сейчас искоренение ISA заставило перенести все устройства, включая BIOS, поближе к процессору (рис.1).

Пока разъемов PCI на материнской плате было не больше 4, такая схема работала идеально ≈ каждому устройству в итоге доставался свой запрос прерывания и можно было не заботиться о разделении прерываний (interrupt sharing) и выстраивании цепочек. Но очень скоро 4-х слотов перестало хватать, и пришлось выдавать двум слотам одинаковый набор прерываний. Вот тут-то проблема interrupt sharing встала во всей красе (рис. 2).

Надо сказать, что в раскладе прерываний слот AGP выглядит, как еще один слот PCI, поэтому на всех материнских платах, где ровно 4 PCI, но есть еще и AGP, обязательно есть одна связанная пара. А на каждый дополнительный слот PCI появляется еще одна пара.

Практика

Вот теперь можно перейти от слов к делу и проверить, как существующие PCI-устройства соблюдают требования спецификации и работают с разделяемыми прерываниями. Для проверки был использован ПК на базе материнской платы ASUS P3B-F с процессором Celeron 566 МГц и памятью 128 МБ.
Были протестированы:

На тестируемом ПК была установлена ОС Windows95 OSR2.1 (2.0 c USB supplement), Internet Explorer 5.0 (это существенно, т. к. при его установке обновляются некоторые важные DLL-библиотеки). Все перечисленные устройства были поочередно вставлены, установлены их драйверы и проверена работоспособность при обычном (монопольном) выделении запросов прерывания.
Помимо всего этого оборудования, в тестировании косвенно приняли участие 2 ПК с ОС Win95, служившие сетевыми клиентами. Один из них работал на 100 Мб/c сегменте сети, а другой ≈ на 10 Мб/c сегменте. IP-маршрутизация была разрешена в соответствии с рекомендациями. Для проверки функционирования SCSI-2 контроллера к нему подключался CD-ROM NEC CDR-222. Для проверки функционирования платы видеозахвата к ней была подключена видеокамера.

Первый этап тестирования

Slot AGP ATi 3D RAGE PRO.
1 PCI ≈ Realtek RTL8029AS.
2 PCI ≈ Miro Video DC10.
3 PCI ≈ SB128 PCI.
4 PCI ≈ Realtek RTL8139.
5 PCI ≈ Symbios 53C810.
6 PCI ≈ не занят.

Включаем машину, загружаемся. Загрузка проходит нормально. Разделенные прерывания достались в этот раз двум парам ≈ Realtek 8029AS и ATi 3D Rage Pro, и Realtek 8139 в паре с Symbios 53C810. Диспетчер устройств рапортует, что все устройства работают. Но мы ему не верим, и правильно делаем! Вставляем CD в CD-ROM и видим парадоксальный результат: все команды выполняются, но считать с диска ничего не удается! Звуковые диски при этом проигрываются нормально. Через 5 минут оглавление с диска все же удалось считать. Сеть (оба сегмента) работает нормально. Первый вывод: у SCSI-контроллера не все в порядке.

Выключаем машину, меняем местами контроллер и Ethernet. Загружаемся. Контроллер работает, но только ДО ПЕРВОГО ПРИШЕДШЕГО ПО СЕТИ ПАКЕТА!!! Сеть, как и прежде, работает нормально. Устанавливаем контроллер Tekram 395 и начинаем изменять все документированные параметры ≈ никаких изменений к лучшему.
Итак, налицо факт ≈ в чипе Symbios 53C810 аппаратной поддержки разделяемых прерываний нет! А драйверы как-то пытаются это обойти. В 53C810A и всех старших моделях этой проблемы нет.

Второй этап тестирования

Меняем видеокарту на GeForce. Эффект парадоксален. Машина начинает грузиться, и в момент, когда должен был запуститься GUI-интерфейс, она отправляется на перезагрузку! И так по циклу.
Вынимаем GeForce, ставим i740. И с ней такая же картина. Значит, виновата сетевая плата? Но как же она тогда работала с 3D RagePRO? Осматриваем 3D RagePRO и обнаруживаем на ней джампер, который запрещает прерывания от видеокарты. Но они включены. После изучения всех доступных материалов по данной видеокарте удается, наконец, выяснить, что она прерываниями не пользуется. То есть обработчик прерывания, устанавливаемый драйвером этой видеокарты, представляет собой простую заглушку. И, следовательно, можно считать, что она никому не мешает использовать свое прерывание.
Пытаемся заставить RTL8029AS работать в паре хоть с кем-нибудь, но эффект одинаков ≈ если к ней подключен сетевой кабель, то приход пакетов во время загрузки Windows вызывает перезагрузку. При этом работа на монопольно выделенном прерывании абсолютно стабильна и никаких нареканий не вызывает. Вывод: может быть, сама карта и имеет средства разделения прерываний, но драйвер об этом не подозревает! В то же время, у 100 Мб/c RTL8139 никаких проблем разделение прерываний не вызывает. Но что делать, если ПО требует совместимости с NE2000? У нас в запасе есть другая сетевая карта такого же класса, но на чипе Winbond 940. Ее драйвер оказывается способен работать с разделяемыми прерываниями, но скорость 10 Мб/c сегмента падает почти вдвое ≈ с 600 КБ/с до 320 КБ/c. Видимо, в рамках совместимости с NE2000 аппаратная поддержка shared interrupts реализована недостаточно продуманно.

Третий этап тестирования

Видеокарта ≈ GeForce. Она совершенно точно использует свое прерывание. Устанавливаем в первый слот PCI-контроллер Ultra-ATA Promise Ultra66, подключаем к нему ЖД, и запускаем с него Half Life. Контроллер диска и видео оказываются на одном прерывании.
Система работает устойчиво. При этом интенсивно работают как 3D-вывод, так и обмен с диском. Программы успешно разбираются, кто из них вызвал прерывание!
Заменив видеокарту на i740, наблюдаем, что, за исключением уменьшившейся производительности 3D, ничего не пострадало.

Четвертый этап тестирования

Несмотря на то, что во многих FAQ▓s написано, что нельзя заставлять звуковые карты работать с shared interrupts, мы все же проверим, так ли это на самом деле. Будем сначала попарно использовать мультимедиа с RTL8139, с которой до этого никаких проблем не было обнаружено. SB128 PCI показал себя с лучшей стороны ≈ никаких проблем не замечено, количество передаваемых кадров/c (fps) в Timedemo Quake2 не изменилось, занятость процессора при декодировании DVD не увеличилась.
Но вот при совместном использовании SB128 PCI и видеокарты было обнаружено слабое ╚запинание╩ звука при работе Direct3D, например, во время работы Final Reality. Значит, FAQ▓s в чем-то правы, и, несмотря на возможность такой работы, лучше ее избегать.
В инструкции к плате Miro Video DC10 написано, что ее прерывание не может быть разделяемым. Несмотря на это, она отлично работает как в паре с RTL8139, так и в паре с SB128 PCI. Причем, ни VIDCAP32, ни SMARTCAP не выявляют никаких проблем ни со звуком, ни с изображением. Правда, это относится только к драйверам для Studio DC10+.

Итоги

1. В целом, проверка показала, что современные устройства, для которых декларируется совместимость с PCI 2.1, правильно работают с разделяемыми прерываниями. Исключение составляют относительно старые платы (как Symbios 53C810) или те, у которых совместимость со старыми аппаратными средствами поставлена во главу угла (как RTL8029AS, совместимая с NE2000 по регистрам).

2. Тем не менее, для устройств, которые генерируют большой поток прерываний, нежелательна работа с разделяемыми прерываниями, ≈ она может вызвать потери времени, и, как следствие, потери информации.

3. Не рекомендуется работа мультимедиа с shared interrupts, и вообще, не следует назначать одинаковых прерываний больше, чем позволяет конструкция материнской платы.

4. Можно утверждать, что, практически, все выпущенные в этом (и прошлом) году платы не вызовут проблем с выделением им прерываний. И, значит, шина ISA утратит еще один свой козырь ≈ большее количество независимых запросов прерывания.


       КОМПЬЮТЕР-ИНФОРМ 
          Главная страница || Статьи ╧ 2'2001 || Новости СПб || Новости России || Новости мира

Анкета || Рубрики || Работа || Услуги || Поиск || Архив || Дни рождения
О "КИ" || График выхода || Карта сайта || Подписка

Главная страница

Сайт газеты "Компьютер-Информ" является зарегистрированным электронным СМИ.
Свидетельство Эл ╧ 77-4461 от 2 апреля 2021 г.
Перепечатка материалов без письменного согласия редакции запрещена.
При использовании материалов газеты в Интернет гиперссылка обязательна.

Телефон редакции (812) 118-6666, 118-6555.
Адрес: 196084, СПб, ул. Коли Томчака, д. 9
Пейджер 238-6931(аб.3365)
e-mail:
Для пресс-релизов и новостей