Добре, коли після збирання чи планової модернізації комп`ютер з першого разу запускається, працює стабільно і без глюків. Набагато гірше, якщо виникають несподівані проблеми - спонтанні перезавантаження і зависання, збої програм, чи непрацездатність "невидимість" пристроїв і т.п. Перша причина, що звичайно приходить у голову в такому випадку - конфлікт переривань. А чи добре ми знаємо природу цього явища, чи досить підготовлені до боротьби з ним? Що таке IRQ Переривання - це базовий механізм реакції системи на виникаючі події. Апаратні переривання, називані звичайно IRQ (Interrupt ReQuest) - це фізичні сигнали, за допомогою яких контролер пристрою інформує процесор про необхідність обробити деякий запит. Умовно схема обробки переривання виглядає в такий спосіб: - процесор одержує сигнал переривання і його номер;
- по спеціальній таблиці відшукується адреса програми, відповідальної за обробку переривання з даним номером - обробника переривання;
- процесор припиняє поточну роботу і переключається на виконання оброблювача (у загальному випадку це деякий драйвер);
- драйвер одержує доступ до пристрою і перевіряє причину виникнення переривання;
- запускаються запитані дії - ініціалізація, конфігурування пристрою, обмін даними й ін.
- драйвер завершує роботу, і процесор повертається до перерваної задачі.
Очевидно, що для коректної роботи механізму переривань необхідне виконання двох умов: по-перше, сигнал запиту повинний доходити до процесора, і, по-друге, драйвер-оброблювач повинен правильно реагувати на цей сигнал. У випадку конфлікту не дотримується друга умова: сигнал переривання приходить, але реакція на нього виявляється неправильної, у результаті чого ми маємо (у кращому випадку) непрацездатний пристрій. КонфліктМожна сказати, що конфлікт - це ситуація, при якій кілька об`єктів одночасно намагаються одержати доступ до ресурсу, що призначений тільки для одного з них. Конфлікт переривань виникає в тому випадку, якщо кілька пристроїв використовують ту саму лінію переривання для посилки сигналу запиту, і немає механізму, що дозволяє обробляти конкуруючі запити. Якщо драйвер, одержуючи керування, працює не з тим пристроєм, що надіслало запит, то або відбувається збій, або один із пристроїв попросту не працює. Виникає питання: чи можуть кілька пристроїв використовувати ту саму лінію переривання, чи це в принципі неможливо? Адже якщо драйвер зможе визначити, від кого саме прийшов запит, то він буде реагувати на сигнали тільки "свого" пристрою, ігноруючи всі інші. Але це повинно бути якимось чином заздалегідь визначено, інакше конфлікт неминучий. Локальна шина 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 можна спостерігати, які саме пристрою (включаючи вбудовані) використовують ту чи іншу лінію. 
 Розподіл номерів IRQ засобами WindowsДеколи номери переривань розподіляються операційною системою. Як показали проведені мною експерименти, Windows`98 починає втручатися в зроблені ВіоS`ом дії тільки в крайніх випадках. При наявності нормального 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 заново. Сподіваюся, приведена вище інформація допоможе вам у боротьбі з глюками "заліза". І пам’ятайте: більшість виникаючих проблем зв`язані з низьким рівнем комп`ютерної грамотності хазяїна комп`ютера. Тому потрібно завжди прагнути до самоосвіти, тоді і проблем буде поменше, а ті, що усе-таки виникнуть - не будуть здаватися нерозв`язними.
|