Конфлікти IRQ, Різне, Залізо, статті

Макс Курмаз

Добре, коли після збирання чи планової модернізації комп’ютер з першого рази запускається і працює стійко і без глюків. Набагато гірше, якщо виникають несподівані проблеми – спонтанні перезавантаження і зависання, збої програм, непрацездатність або “невидимість” пристроїв і т.п. Перша причина, яка зазвичай приходить в голову в такому разі, – конфлікт переривань. А чи добре ми знаємо природу цього явища, чи достатньо підготовлені до боротьби з ним?

Що таке IRQ

Переривання – це базовий механізм реакції системи на виникаючі події. Апаратні переривання, звані зазвичай IRQ (Interrupt ReQuest) – це фізичні сигнали, за допомогою яких контролер пристрою інформує процесор про необхідності обробити певний запит. Умовно схема обробки переривання виглядає наступним чином:

1) процесор отримує сигнал переривання і його номер;

2) по спеціальній таблиці відшукується адреса програми, відповідальної за обробку переривання з даним номером – обробника переривання;

3) процесор припиняє поточну роботу і переключається на виконання обробника (в загальному випадку це деякий драйвер);
4) драйвер отримує доступ до пристрою і перевіряє причину виникнення переривання;

5) запускаються запитані дії – ініціалізація, конфігурування пристрою, обмін даними та ін

6) драйвер завершує роботу, і процесор повертається до перерваної задачі.

Очевидно, що для коректної роботи механізму переривань необхідне виконання двох умов: по-перше, сигнал запиту повинен доходити до процесора і, по-друге, драйвер-обробник повинен правильно реагувати на цей сигнал. У випадку конфлікту не дотримується друга умова: сигнал переривання приходить, але реакція на нього чиниться неправильною, в результаті чого ми маємо (в кращому випадку) не працювати.

Конфлікт

Можна сказати, що конфлікт – це ситуація, при якій кілька об’єктів одночасно намагаються отримати доступ до ресурсу, який призначений тільки для одного з них. Конфлікт переривань виникає в тому випадку, якщо декілька пристроїв використовують одну і ту ж лінію переривання для посилки сигнал запиту і немає механізму, що дозволяє обробляти конкуруючі запити. Якщо драйвер, отримуючи управління, працює не з тим пристроєм, який надіслало запит, то або відбувається збій, або один з пристроїв просто не працює.

Виникає питання: чи можуть кілька пристроїв використовувати одну і ту ж лінію переривання, чи це в принципі неможливо? Адже якщо драйвер зможе визначити, від кого саме прийшов запит, то він буде реагувати на сигнали тільки “свого” пристрою, ігноруючи всі інші. Але це має бути будь-яким чином заздалегідь обумовлено, інакше конфлікт неминучий.

Локальна шина PCI була спроектована з урахуванням спільного використання переривань. Кожен пристрій PCI повинне коректно працювати на одній лінії переривання з іншими PCI-пристроями. Це зроблено таким чином: факт наявності сигналу на лінії переривання визначається не по фронту, тобто зміни рівня напруги, а по самому факту наявності певного напруги. Змінювати напругу в лінії може відразу кілька пристроїв, стаючи як би в чергу на обслуговування.

Таким чином, спільне використання одного IRQ декількома PCI-пристроями не є конфліктом за визначенням. Однак іноді проблеми все-таки виникають. По-перше, не всі пристрої PCI коректно працюють на одній лінії переривання з іншими. По-друге, іноді драйвери мають помилки, через які вони не можуть правильно визначати джерело сигналу, заважаючи іншим драйверам. По-третє, далеко не всі пристрої працюють на шині PCI; наприклад, ISA-пристрої, до яких відносяться, наприклад, контролери COM / LPT-портів, ділити переривання з іншими не вміють. Щоб чітко уявляти собі, як можна запобігти конфліктів або усунути їх, потрібно розібратися в механізмі управління
IRQ.

Організація апаратних переривань у персональному комп’ютері

Як ви знаєте, персональні комп’ютери почалися з IBM PC. Його архітектура передбачала вісім ліній апаратних переривань (IRQ), якими керував спеціальний контролер. Кожній з них призначався номер, який визначав пріоритет переривання та адресу обробника його (так званий вектор переривання). Нова архітектура, IBM PC AT, передбачала ще вісім ліній переривань, для яких використовувався другий контролер, що підключається до однієї з ліній переривання першого контролера. На жаль, дана архітектура стала останньою після того, як фірма IBM втратила можливість керувати розвитком створеної нею платформи, тому всі сучасні комп’ютери як і раніше мають тільки шістнадцять переривань, одне з яких використовується другий контролер.

У комп’ютера IBM PC AT була тільки одна шина, по якої пристрої могли спілкуватися з процесором і пам’яттю – ISA. Більшість ліній переривань були закріплені за стандартними ISA-пристроями, що залишилися були зарезервовані на майбутнє. Коли це майбутнє наступило, з’ясувалося, що нової універсальної шини PCI дісталося всього чотири вільних переривання. Тому і був придуманий хитрий механізм спільного використання переривань (IRQ Sharing) і динамічного перевизначення номерів (IRQ Steering або
Mapping).

Суть механізму управління переривань PCI-пристроїв в наступному. У загальному випадку існує чотири фізичних лінії PCI-переривань, званих PIRQ0, PIRQ1, PIRQ2 і PIRQ3. Вони підключені до контролера переривань. Кожне PCI-пристрій зі свого боку як би має чотири роз’єми, звані INT A, INT B, INT C і INT D. Підключати лінії до роз’ємів можна в будь-якому порядку. Наприклад, для першого PCI-слота можна зробити таку розводку: PIRQ0 – INT A, PIRQ1 – INT B, PIRQ2 – INT C, PIRQ3 – INT D. А для другого – по-іншому: PIRQ0 – INT B, PIRQ1 – INT C, PIRQ2 – INT D, PIRQ3 – INT A. Зазвичай пристрій вимагає тільки одну лінію переривання, підключену до INT A. Будучи встановленим у перший слот, пристрій використовує лінію PIRQ0, а в другому слоті на тому ж контакті буде лінія PIRQ1. Тим самим пристрою в різних слотах будуть використовувати різні фізичні лінії переривань. Апаратний конфлікт між ними буде виключений.

Шина AGP, будучи по суті спеціалізованої модифікацією PCI, теж використовує одну з ліній PIRQ – зазвичай PIRQ0.

Для сучасних систем чотирьох ліній виявляється недостатньо, тому в нових чіпсетах часто застосовуються вісім ліній PIRQ, які точно так само в різних комбінаціях підключаються до слотів PCI і вбудованим в плату пристроїв.

Лінії PIRQ підключаються до контролера переривань. Їм, як і іншим лініям, призначаються логічні IRQ-номери. Якщо на одній фізичній лінії знаходяться кілька пристроїв (а це допустимо), то всі вони будуть мати один і той же номер IRQ. Якщо пристрої знаходяться на різних фізичних лініях, вони все одно можуть отримати однакові номери IRQ. Нормальні драйвери дозволять їм вільно працювати без втрати продуктивності, так як шина PCI все одно може захоплюватися тільки одним пристроєм. Головне – розпізнати, від якого пристрою прийшов сигнал.

Номери лініях PIRQ призначаються автоматично завдяки горезвісному механізму Plug & Play. Але ж є й ISA-пристрої, що підтримують Plug & Play. Вони теж мають можливість автоматично отримати номер IRQ. Але їхня лінія переривання належить їм монопольно, і якщо такий же номер отримає одна з ліній PIRQ, виникне нерозв’язний конфлікт.

Отже, ми з’ясували, що пристрою PCI повинні бути позбавлені проблем з конфліктами IRQ. Якщо вони, звичайно, правильно працюють, а так буває не завжди. До того ж драйвери повинні підтримувати механізм спільного використання переривань. Пристрої ISA не вміють ділитися лініями переривань і тому є провокаторами конфліктів. Отже, завдання усунення конфліктів зводиться до правильного розподілу номерів (джерело проблем – ISA-пристрої і “криві” драйвери) або до розведення по різних фізичних лініях (“криві” PCI-контролери).

Давайте розглянемо, яким чином в системі відбувається розподіл номерів і як ми можемо вплинути на цей процес.

Карта переривань

Як я вже говорив, більшість номерів IRQ уже зайняті стандартними пристроями, точніше, призначені їх лініях переривань. Пройдемося по порядку:
0 – системний таймер (номер завжди зайнятий);
1 – клавіатура (Номер завжди зайнятий);
2 – другий контролер переривань (завжди зайнятий);
3 – Порт COM2 (може бути відключений, а номер – звільнений);
4 – порт COM1 (Може бути відключений, а номер – звільнений);
5 – порт LPT2 (звичайно номер вільний);
6 – контролер гнучких дисків (може бути відключений, а номер – звільнений);
7 – порт LPT1 (якщо не в режимі EPP або ECP, то номер вільний);
8 – годинник реального часу (завжди зайнятий);
9 — вільний;
10 – вільний;
11 – вільний;
12 – миша PS / 2 (може бути вільний, якщо немає такої миші);
13 – співпроцесор (завжди зайнятий);
14 і 15 – Контролер жорстких дисків (може бути відключений, а номер – звільнений).
В типовою системі вільні номери 5, 7, 9-11, тобто п’ять з п’ятнадцяти. Крім того, можна сміливо відключити COM2 і LPT1-порти, збільшивши число вільних номерів до семи. Вільні – не означає, що не зайняті, просто між ними можлива вільна перетасовка.
В будь-якій системі є три стандартних PCI-пристрої – ACPI-, USB-контролери і відеокарта, кожне з яких займе по одному номеру. Складне пристрій (наприклад, звукова карта) може зажадати кілька ліній – INT A, INT B і т.д. для своїх компонентів, які між собою не будуть конфліктувати (як-не різні фізичні лінії), а от з іншими пристроями – запросто.
Дізнатися, як в даний момент розподілені номери переривань, можна декількома способами. У самому початку завантаження комп’ютера з’являється текстова таблиця конфігурації. Відразу після неї йде перелік PCI-пристроїв із зазначенням призначеного їм номера IRQ (Див. скріншот). Інший спосіб працює в Windows 9x. В панелі управління є іконка “Система”, в викликається аплеті – закладка “Пристрої”. Вибираємо властивості пристрою “Комп’ютер”, і там будуть перераховані всі пристрої з зазначенням їх IRQ (див. скріншот).
У Windows 2000 у нас немає доступу до управління перериваннями, тому для перегляду списку IRQ потрібно скористатися стандартною інформаційної утилітою (Панель управління / Адміністрування / Управління комп’ютером / Відомості про систему / Ресурси апаратури).

Розподіл номерів IRQ засобами BIOS

В системі номера IRQ розподіляються між фізичними лініями двічі. Перший раз це робить системний BIOS при початковому завантаженні системи. Кожному Plug & Play-пристрою (усі PCI, сучасні ISA, інтегровані пристрої), а точніше, його лінії переривання, призначається один номер з десяти можливих. Якщо номерів не вистачає, кілька ліній одержують один загальний. Якщо це лінії PIRQ, то нічого страшного – за наявності нормальних драйверів і підтримки з боку операційної системи (про це див нижче) все буде працювати. А якщо один номер одержують кілька ISA-пристроїв або PCI-і ISA-пристрою, то конфлікт просто неминучий, і тоді потрібно втручатися в процес розподілу.
Перш за все, потрібно відключити всі невикористовувані ISA-пристрої (у системах без слотів ISA вони теж присутні) – порти COM1, COM2 і дисковод. Також можна відключити режими EPP і ECP порту LPT, тоді переривання IRQ7 стане доступно.
В BIOS Setup нам знадобиться розділ “PCI / PNP Configuration”. Є два базових способу вплинути на розподілу номерів IRQ: заблокувати конкретний номер і прямо призначити номер лінії
PIRQ.
Перший спосіб доступний для всіх BIOS: знайдіть список пунктів “IRQ x used by: “(у нових BIOS ховається в підменю” IRQ Resources “). Тим перериваннях, які повинні бути призначені виключно ISA-пристроїв, потрібно поставити “Legacy ISA”. Тим самим при роздачі номерів PCI-пристроїв дані переривання будуть пропущені. Вступати так слід в тому випадку, якщо небудь ISA-пристрій вперто стає на одне переривання з PCI-пристроєм, через що обидва не працюють. Тоді ми знаходимо номер цього IRQ і блокуємо його в BIOS Setup. PCI-пристрій переходить на новий номер IRQ, а ISA-пристрій залишається. Конфлікт дозволений.
Другий, більш зручний спосіб управління номерами IRQ – пряме призначення. У тому ж підміню BIOS Setup можуть бути пункти виду “Slot X use IRQ» (інші назви: “PIRQx use IRQ”, “PCI Slot
x priority”, “INT Pin x IRQ”). 
З їх допомогою кожної з чотирьох лінії PIRQ можна призначити конкретний номер. До речі, в нових AwardBIOS 6.00 можна спостерігати, які саме пристрої (включаючи вбудовані) використовують ту чи іншу лінію. Просто подивіться на праву частину екрану BIOS Setup: на фото показано, як я навів курсор на пункт “Slot 1/5 use IRQ no.”, а праворуч з’явився напис “Display Contr.”. Тобто перша лінія PIRQ використовується відеокартою. Якщо я зараз поставлю небудь певний номер замість “Auto”, відеокарта буде переведена на це переривання.

Розподіл номерів IRQ засобами
Windows

Другий раз номери переривань розподіляються операційної системою. Як показали проведені мною експерименти, Windows’98 починає втручатися в вироблені BIOS’ом дії тільки в крайніх випадках. При наявності нормального BIOS описані тут прийоми не знадобляться.
Слід зауважити, що для правильної роботи механізмів спільного використання IRQ і динамічного розподілу необхідно, щоб Windows розпізнала чіпсет материнської плати і завантажила IRQ Miniport. Чим більш свіжа версія у Windows, тим більше чіпсетів підтримує її власний мініпорт (PCIIMP.PCI). Однак завжди краще перестрахуватися і встановити найсвіжіші драйвери чіпсета.
В Windows 98 управління системою розподілу IRQ здійснюється за допомогою стандартного менеджера пристроїв. У списку системних пристроїв потрібно знайти шину PCI. В її властивості є особлива закладка (див. скріншот). Якщо все налаштоване правильно, там буде згаданий мініпорт (“успішно завантажений”), а управління шиною PCI (Steering) буде включено. Таким чином, Windows’98 має засоби для управління розподілом номери переривань між фізичними лініями. Але оскільки і BIOS найчастіше з цим добре справляється, цей механізм не задіюється.
Але іноді він просто необхідний. Як я вже говорив, PCI-пристрої не повинні конфліктувати у випадку, якщо вони використовують одне і те ж логічне переривання. Інша справа – ISA-пристрої, до яких відносяться також і COM-і LPT-порти. Якщо пристрій не-Plug & Play, BIOS може його і не помітити, віддавши зайняте їм переривання PCI-пристрою. Тоді потрібно переривання зарезервувати. Це робиться в диспетчері пристроїв Windows’98: вибираємо пристрій “Комп’ютер”, викликаємо його властивості, перемикаємося на другу закладку. Далі все зрозуміло.
Крім резервування, можна безпосередньо задати номер переривання для пристрою. Для цього потрібно в його властивостях знайти закладку “Ресурси”, відключити автоматичне налаштування і спробувати змінити призначений номер переривання.
На жаль, це працює далеко не завжди.
Windows 2000 – система особлива. Якщо у вас сучасний комп’ютер, то він напевно підтримує інтерфейс конфігурування ACPI. Windows 2000 в такому випадку взагалі проігнорує дії BIOS і “Повісить” все PCI-пристрої на одне логічне переривання. У загальному випадку це буде відмінно працювати (коли немає ISA), але іноді трапляються проблеми. Щоб отримати можливість змінювати номери переривань, потрібно або поміняти HAL-ядро, або перевстановити Windows 2000 з відключеним в BIOS ACPI. Заміна ядра проводиться так: в диспетчері пристроїв вибирайте “Комп’ютер” / “Комп’ютер з ACPI “, змінюйте драйвер на” Стандартний комп’ютер “, перезавантажуйтеся. Якщо це не допоможе, доведеться переустановити Windows 2000 заново.
Сподіваюся, наведена вище інформація допоможе вам у боротьбі з глюками “заліза”. І пам’ятайте: більшість виникаючих проблем пов’язано з низьким рівнем комп’ютерної грамотності господаря комп’ютера. Тому потрібно завжди прагнути до самоосвіти, тоді й проблем буде менше, а ті, що все-таки виникнуть – Не будуть здаватися нерозв’язними.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*