Шина pci і колективні переривання
Дякую вам за підтримку!
Через рік архітектура PC відсвяткує своє двадцятиріччя. Разом з нею двадцятиріччя відсвяткує великий чорний роз'єм, що стоїть на краю плати - точніше, його восьмібітного частина. Шина ISA, яка повинна була зникнути з комп'ютерів ще два роки тому, зовсім не збирається здаватися. У чому ж причина? Адже старі плати ISA здебільшого вже можна замінити новими, розрахованими на шину PCI, благо і внутрішні модеми та звукові карти вже давно випускаються майже виключно для нової шини. Всякі спеціалізовані пристрої типу программаторов і електронних ключів вже давно підключаються або до LPT-порту, або до USB.
Кількість роз'ємів PCI на сучасній платі повного розміру зазвичай дорівнює шести, якщо тільки на ній немає вбудованої периферії. В принципі, цього має вистачити самому вимогливому користувачеві. Але ISA, "щільна" до одного-двох слотів, не бажає зовсім вимирати. Одна з причин, через яку відкладається смерть шини ISA - кількість переривань на шині PCI. Точніше, не кількість, а те, як ними розпоряджаються виробники системних плат.
За специфікації PCI, на переривання відведено чотири контакти. Це набагато менше, ніж на ISA, де на 16-розрядної шини є 11 входів запиту переривань. Але справа в тому, що переривання на ISA і PCI принципово різні сигнали.
На шині ISA переривання спрацьовують по перепаду з "0" в "1". Просто встановлений "1" переривання не викличе, тому, якщо один пристрій виставило сигнал, то іншому марно виставляти на цю ж лінію "1" - контролер переривань на неї не зреагує. Тому на ISA закон простий: один пристрій - одне переривання.
На шині PCI вихід запиту переривання повинен бути з відкритим стоком (те ж саме, що відкритий колектор в TTL), кілька виходів різних пристроїв об'єднуються за схемою "проводового І", тобто їх виходи просто з'єднуються разом і, якщо хоча б на одному з них "0", то і на всій лінії "0". Тому активний запит переривання на шині PCI - "0". І контролер переривань повинен реагувати не на перепад, а на рівень. Таким чином, якщо два пристрої запросили переривання по одній лінії, то програма-обробник має спочатку перевірити, чи її пристрій викликало переривання, обробити виклик (при цьому пристрій зніме запит, але на лінії залишиться "0" через другого пристрою). Контролер, відреагувавши на логічний "0", знову викличе обробник. Той, перевіривши, що "його" пристрій переривання не вимагало, викличе другий обробник. Він виконає вже код, який відповідає за другий пристрій, після чого на вході запиту переривання нарешті з'явиться "1".
Щоб "Daisy chaining" працював, досить в якомусь програмно-доступному регістрі мати прапорець, що повторює стан запиту переривання цього пристрою, а краще - число не обслужених переривань. Регістр з такими функціями може перебувати і серед портів I / O, і навіть бути осередком пам'яті. Цей регістр дозволяє всім PCI пристроїв призначити взагалі всього одне переривання.
У специфікації PCI 2.0 нічого не говорилося про конкретну реалізацію зв'язку між пристроями на шині і контролером переривань. Тому на найстаріших материнських платах з шиною PCI ми можемо бачити конфігураційні перемички ( "джампери"), що дозволяють призначити будь-якого пристрою будь-яке переривання.
У наступній версії, 2.1, з'явився приклад втілення універсального механізму призначення переривань. При цьому лінія Int A на першому роз'ємі PCI стає Int B на другому роз'ємі, Int C на третьому і Int D на четвертому. Решта лінії теж зсуваються на один контакт. Ці чотири дроти йдуть на матричний комутатор, який доводить їх до вільних входів контролера переривань. Такий матричний комутатор 4X4 був частиною мосту PCI-ISA всіх чіпсетів передостаннього покоління, - контролер переривань в архітектурі PC знаходиться на шині ISA. Тільки зараз викорінення ISA змусило перенести всі пристрої, включаючи BIOS, ближче до процесора.
Поки роз'ємів PCI на материнській платі було не більше чотирьох, така схема працювала ідеально, - кожному пристрою в результаті діставався свій запит переривання, і можна було не турбуватися про поділ переривань і вибудовуванні ланцюжків. Але дуже скоро чотирьох слотів перестало вистачати, і довелося видавати двом слотам однаковий набір переривань. Ось тут-то проблема interrupt sharing встала у всій красі.
Треба сказати, що в розкладі переривань слот AGP виглядає, як ще один слот PCI, тому, на всіх материнських платах, де рівно чотири PCI, але є ще й AGP, обов'язково є одна пов'язана пара. А на кожен додатковий слот PCI з'являється ще одна пара.
Ось тепер ми перейдемо від слів до справи і перевіримо, як нинішні PCI-пристрої дотримуються вимог специфікації і працюють з розділяються переривань. Для лабораторної роботи був використаний комп'ютер на базі материнської плати ASUS P3B-F з процесором Celeron 566 і пам'яттю 128 Мбайт.
На випробуваному комп'ютері була встановлена операційна система Windows95 OSR2.1 (2.0 c USB supplement), Internet Explorer 5.0 (це істотно, тому що при його установці оновлюються деякі важливі DLL-бібліотеки). Крім цього, всі перераховані пристрої були по черзі вставлені, встановлені їх драйвера, і перевірена працездатність при звичайному (монопольному) виділення запитів переривання.
Перший етап тестування
ATi 3D RAGE PRO
Включаємо машину, завантажуємося. Завантаження проходить нормально. Розділені переривання дісталися в це раз двом парам - Realtek 8029AS і ATi 3D Rage Pro, і Realtek 8139 в парі з Symbios 53C810.
Диспетчер пристроїв рапортує, що всі пристрої працюють. Але ми йому не віримо, і правильно робимо! Вставляємо CD в CD-ROM, і бачимо парадоксальний результат: всі команди виконуються, але вважати з диска нічого не вдається! Звукові диски при цьому програються нормально. Гаразд, почекаємо п'ять хвилин. Через п'ять хвилин зміст з диска все ж вдалося вважати. Мережа - обидва сегмента - працює нормально. Перший висновок: у SCSI-контролера не все гаразд. Вимикаємо машину, міняємо місцями контролер і Ethernet. Завантажуємося. Контролер працює, але тільки ДО ПЕРШОГО припала до МЕРЕЖІ ПАКЕТУ. Мережа, як і раніше, працює нормально. Встромляємо замість нього Tekram 395 і радіємо його нормальній роботі. Встромляємо назад старий контролер і починаємо грати всіма документально оформлених параметрами - ніяких змін на краще.
Отже, в наявності факт - в чіпі Symbios 53C810 апаратної підтримки поділюваних переривань немає! А драйвери якось намагаються це обійти. За відгуками знаючих людей, в 53C810A і всіх старших моделях цієї проблеми немає.
Другий етап тестування
Невже така сучасна і дорога карта не вміє працювати з shared interrupts?

Намагаємося змусити RTL8029AS працювати в парі хоч з ким-небудь, але ефект однаковий - якщо до неї підключений мережевий кабель, то прихід пакетів під час завантаження Windows викликає перезавантаження. При цьому робота на монопольно виділеному перериванні абсолютно стабільна і ніяких нарікань не викликає.
Третій етап тестування
Система працює, як швейцарський годинник! При тому, що інтенсивно працює як 3D-висновок, так і обмін з диском, програми успішно розбираються, хто з них викликав переривання! Ось все б так!

Четвертий етап тестування
Незважаючи на те, що в багатьох FAQ'ах написано, що не можна примушувати звукові карти працювати з shared interrupts, ми все ж перевіримо, чи так це насправді. Будемо для початку парувати мультимедіа з RTL8139, з якої до цього ніяких проблем не виявлено. SB128 PCI показав себе з кращого боку - жодних проблем не помічено, кількість fps в Timedemo Quake2 не змінилося, зайнятість процесора при декодуванні DVD-дисків не зросла.

В інструкції до плати Miro Video DC10 прямо написано, що її переривання не може бути розділяються. Незважаючи на це, вона відмінно працює як в парі з RTL8139, так і в парі з SB128 PCI, причому ні VIDCAP32, ні SMARTCAP не виявляється ніяких проблем ні зі звуком, ні з зображенням. Правда, це відноситься тільки до драйверів для Studio DC10 +, може бути, зі своїми рідними вона б так не працювала.
Проте, для пристроїв, які генерують великий потік переривань, небажана робота з розділяються перериваннями, - вона може викликати втрати часу, і, як наслідок, втрати інформації.
Звичайно, за розумний час неможливо перевірити роботу кожного пристрою з кожним, але зазвичай це і не потрібно - в найгіршому випадку у нас буде три ланцюжки з двох пристроїв кожна, і, комбінуючи ці пари, можна отримати нормальну роботу всієї системи. І саме вперте пристрій можна увіткнути в другій слот PCI - там воно зможе насолодитися монополією на своє переривання.
На жаль, універсальних рекомендацій дати не можна, але можна, проте, стверджувати, що практично всі випущені в цьому і минулому році плати не викличуть проблем з виділенням їм переривань. І, значить, шина ISA втратить ще один свій козир - більшу кількість незалежних запитів переривання.
З протестованих плат з розділяються переривань не змогли працювати тільки RTL8029AS і Symbios 53C810. В обох випадках це може бути пояснено "поважним" з комп'ютерних мірками віком "заліза". Тим не менш, не рекомендується робота мультимедіа з shared interrupts, і взагалі, не слід призначати однакових переривань більше, ніж змушує конструкція материнської плати.