Чи бувало у вас так: ви включаєте сканер або підключаєте зовнішній привід компакт дисків, і в цей момент вся система починає помітно гальмувати і вести себе неадекватно: миша по екрану рухається ривками, звук починає заїкатися або відключається ... Бувають і більш важкі випадки ....
Дмитро Зінов'єв
Чи бувало у вас так: ви включаєте сканер або підключаєте зовнішній привід компакт дисків, і в цей момент вся система починає помітно гальмувати і вести себе неадекватно: миша по екрану рухається ривками, звук починає заїкатися або відключається ... Бувають і більш важкі випадки. Наприклад, після установки нової звукової плати, при будь-яких спроб вивести звук, навіть при старті Windows, комп'ютер зависає на смерть. Якщо бувало, то ця стаття - про вашому випадку. Якщо ні, то все одно прочитайте цю статтю - якщо раптом це станеться, то ви будете знати, що робити.
Ці проблеми, частіше за все, викликані конфліктом апаратних переривань комп'ютера. Забавно, але досить серйозна частина проблем з комп'ютером після установки нового заліза якраз і пов'язана з цими самими конфліктами, тільки про них ніхто не говорить і взагалі, ця тема мало обговорюється. Розуміння всього питання в цілому досить велика тема і кожен випадок конфлікту часто відрізняється від попереднього, як за симптомами, так і за методами рішення. У цій статті ми спробуємо пояснити ситуацію, що склалася для користувачів, які вже не бояться комп'ютерів, але ще не набрали достатньо досвіду для вирішення проблем з конфліктами заліза самостійно. На жаль, деякі моменти статті досить важко можуть сприйматися із-за описів систем побудованих на нечіткій логіці, яка, до речі, і є сильною стороною людини по відношенню до комп'ютерів.
Трохи історії
Багатьом ця частина статті здасться необов'язковою, так як розповідь буде про старі часи, десь з 1985 року, але ця інформація важлива тим, хто хоче розібратися в суті проблеми і зрозуміти, чому все склалося так неоднозначно.
Давним-давно, в далекій Америці, був розроблений процесор x86, який є прабатьком всіх процесорів, що використовуються в персональних комп'ютерах стандарту IBM PC. Тобто всі Pentium і Athlon мають у своїй основі старий, добрий процесор x86. Архітектура сучасних процесорів вже дуже сильно відрізняється від першого x86, тим не менш, деякі моменти збереглися з тих давніх часів, коли x86 процесор знаходився на початку свого шляху, а саме з середини вісімдесятих років минулого століття. Одним з таких моментів є обмеження кількості ліній апаратних переривань для центрального процесора.
Апаратне переривання - це реакція процесора на події, що відбуваються асинхронно по відношенню до виконуваного програмного коду. Тобто переривання - це момент коли центральний процесор за запитом від викликав переривання пристрої відкладає виконувану задачу і переключається на завдання, необхідну для роботи пристрою. Після того, як завдання для пристрою виконана, процесор знову переключається на виконання основної програми. Звукову карту переривання змушує програти наступну мікросекунду звуку, а відеокарту переривання змушує зробити наступний кадр. За допомогою переривань центральний процесор змушує жити весь комп'ютер. Лінія апаратного переривання - це, перебільшено кажучи, фізичний дріт, що сполучає мікросхему контролера переривань і пристрій. Кількість ліній апаратних переривань центрального процесора обмежено цифрою 16, тобто і пристроїв, що використовують лінії апаратного переривання, не може бути більше 16. Для організації ліній апаратних переривань всередині комп'ютера використовується спеціалізована мікросхема - контролер переривань (PIC, Programmable Interupt Controller). Ця мікросхема сумісна по системі програмних команд з мікросхемою 8259A, яка мала всього 8 входів і використовувалася в комп'ютерах класу IBM PC XT (8086 процесор). З виходом IBM PC AT (процесор 80286) внутрішня структура організації переривань змінилася. Переривань стало вдвічі більше за рахунок використання ще однієї мікросхеми 8259A, яку підключили до другої лінії першої мікросхеми. Така архітектура стандартного контролера переривань збереглася і донині, причому ніяких змін на найближче майбутнє не намічається. Навіть з приходом на ринок 64-бітових x86 сумісних процесорів ситуація не зміниться. Лінії апаратних переривань позначили значенням - IRQ (Interupt ReQuest). Як вже згадувалося, фізично біля комп'ютера є 16 ліній апаратних переривань, але ця цифра сильно зменшується за рахунок переривань? вже використаних вбудованими пристроями. Деякі переривання мають статус системних, тому їх використання та перепризначення їх номера за бажанням користувача неможливо. У таблиці вони виділені буквою S перед номером. За замовчуванням зайняті такі переривання:
Системність | Лінія IRQ | Пристрій |
S | 0 | Системний таймер |
S | 1 | Клавіатура |
S | 2 | Cascad (Висновок на другу мікросхему контролера ліній переривань) |
S | 8 | Годинник реального часу |
9 | Вільно | |
10 | Вільно | |
11 | Вільно | |
12 | Вільно | |
S | 13 | Співпроцесор |
14 | IDE Primary (Контролер жорстких дисків) | |
15 | IDE Secondary (Контролер жорстких дисків) | |
3 | Com Port 1 (Миша) | |
4 | Com Port 2 (Модем) | |
5 | Вільно | |
S | 6 | Floppy (Дисковод) |
7 | LPT (Принтер) |
Така розкладка переривань дуже довго зберігалася на багатьох побутових комп'ютерах. Майже всі комп'ютери на базі процесорів 386, 486 і Pentium мають такий список використаних переривань. При такому розкладі вільних переривань в комп'ютері виявляється всього п'ять (5, 9, 10, 11, 12), але цієї кількості для більшості випадків було цілком достатньо. Пристроїв, що вимагають переривання і встановлюються в комп'ютер у вигляді плат розширення, рідко було більше трьох. Стандартний набір того часу виглядав так: відеокарта, звукова плата і мережева карта. При цьому було важливо, щоб одне переривання ні в якому разі не використовувалося двома пристроями одночасно, оскільки це спричинить конфлікт системних ресурсів, і обидва пристрої, що знаходяться на одному перериванні, працювати не будуть. Завданням збирача комп'ютера на той момент було розведення всіх пристроїв за перериваннях таким чином, щоб ні одне пристрій не перетиналося з іншим.
Напевно, саме час пояснити, що таке конфлікт переривань. Якщо два пристрої знаходяться на одній лінії переривань, то драйвер може їх сплутати і переслати виконуваний шматок програми не тієї «залізці», при цьому змушуючи її виконати цей шматок коду. Наприклад, мережева плата та звукова карта знаходяться на 10 перериванні. Мережева карта отримує пакет з локальної мережі з запитом на отримання файла і відправляє запит на переривання центральному процесору.
Процесор відпрацьовує переривання, зупиняє виконувану задачу і передає управління драйверу мережевої карти, для відпрацювання необхідних для приймання файлу дій. Драйвер починає роботу з пристроєм, від якого прийшло переривання. От тільки працювати він починає не з мережевою платою, а зі звуковою картою, що знаходиться на тій же лінії, передаючи їй команду для приймання файлу. Звукова карта виконує прийняті команди, і повністю завішує комп'ютер з BSOD (Blue Screen Of Death).
Існує ще одна невелика тонкість. Всі лінії переривань мають свій пріоритет. Чим вищий пріоритет у лінії переривання, тим швидше процесор відповість на запит від пристрою знаходиться на цій лінії. Пріоритети переривань наведені в таблиці нижче в порядку убування.
Пріоритет переривань | |||||||||||||||
0 | 1 | 2 -> | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 3 | 4 | 5 | 6 | 7 |
Історично склалася архітектура наклала дуже сильний відбиток на пріоритети ліній переривань. Підключена другий мікросхема контролера до другої лінії першої мікросхеми вклинюється в пріоритети. Тому лінії другого мікросхеми мають більш високий пріоритет, ніж лінії першої. При цьому, обидві мікросхеми виглядають для користувача єдиним модулем контролера переривань - PIC (Program Interrupt Controller). Більш того, вже давно дві мікросхеми для цих цілей не використовується, все це вмонтоване в північний міст чіпсета, але розкладка пріоритетів переривань збереглася. Чим більше ресурсів від комп'ютера вимагає пристрій, тим більш високий пріоритет повинен бути у лінії IRQ присвоєної цього пристрою. Тобто, для відеокарти бажано віддавати дев'ятому або десяте переривання, якщо воно вільно. Для звукової карти теж бажано знайти переривання, що знаходиться на другому контролері. Детальніше про це питання ми поговоримо трохи нижче.
Але час не стоїть на місці, і ситуація з перериваннями почала погіршуватися одночасно з розробкою нових технологій і розвитком усієї комп'ютерної області. З'явилися нові стандарти портів введення-виведення, які вимагають власного переривання. Наприклад, порти USB або PS / 2, які є на справжній момент стандартом де-факто для всіх комп'ютерів. Вільних переривань ставало все менше, а рішення системних конфліктів ставало все більш складним.
Справжнє ...
Вся ситуація сильно змінилася з появою систем ACPI і IRQ Sharing. На жаль, ці системи ніяк не можна описати в одне речення, тому ми розглянемо їх трохи докладніше.
Система ACPI (Advanced Configuration and Power Interface, Розширений інтерфейс конфігурації і керування живленням) була розроблена в 1997 році трьома компаніями Microsoft, Intel і Toshiba. Якщо ваш комп'ютер підтримує ACPI в залозі, то при інсталяції операційних систем WindowsXP і Windows 2000 підтримка ACPI автоматично вбудовується в ядро операційної системи. Система ACPI займається менеджментом енергозберігаючих функцій комп'ютера, таких, як автоматичне вимикання блоку харчування після успішного завершення роботи операційної системи, економія заряду батарей, переклад комп'ютера в режим сну і пробудження його від сну. Якщо ваш комп'ютер не - ноутбук, то єдино корисна функція від ACPI в плані управління живленням - це автоматичне відключення блоку живлення.
Друга функція ACPI - це автоматичний розподіл системних ресурсів всередині комп'ютера. Поки ACPI в дії, ви не можете змінити ніяких параметрів, пов'язаних з перериваннями. Більш того, система ACPI підтримує роботу розширеного контролера переривань APIC.
APIC (Advanced Programmable Interrupt Controller) - вдосконалений програмований контролер переривань. Для багатопроцесорних систем це необхідна система, тому що дозволяє розподілити між процесорами навантаження по роботі з пристроями. Тобто, цей контролер можна запрограмувати на обробку деяких ліній переривань першим процесором, а деяких - другим. Для однопроцесорних систем ця опція всього лише включає можливість використання в операційних системах WindowsXP і Windows2000 віртуальних переривань. Ми не будемо приводити алгоритми роботи віртуальних переривань. Це безглуздо, їх не можна змінювати, і вони сильно залежать від реальних. Якщо у вас однопроцесорна система, то відключення цієї функції вельми рекомендовано, але про це пізніше.
IRQ Sharing - система? дозволяє двом пристроям одночасно перебувати на одному перериванні. Фізично виходить так, що на одній лінії IRQ може висіти декілька пристроїв, при цьому менеджмент між ними забезпечується операційною системою. IRQ Sharing - неоднозначна система, так як використання її необхідно для нормальної роботи ПК, але при цьому можливі найрізноманітніші проблеми і глюки. Насправді, використання і приборкання саме цієї системи і є мета цієї статті.
Сукупність вищеописаних систем була визнана стандартом і включена в список вимог до комп'ютерного обладнання - PC2001. Після реалізації ACPI і IRQ Sharing на всіх материнських платах, починаючи з материнських плат для Pentium 1 (VX і TX чіпсети від Intel), склалася розкладка переривань, яка існує в кожному комп'ютері і до цього дня. Ось вона:
Системність | Лінія IRQ | Пристрій |
S | 0 | Системний таймер |
S | 1 | Клавіатура |
S | 2 | Cascad (Висновок на другу мікросхему контролера ліній переривань) |
S | 8 | Годинник реального часу |
9 | ACPI Controller | |
10 | Вільно | |
11 | USB | |
S | 12 | PS2 |
S | 13 | Співпроцесор |
14 | IDE Primary (Контролер жорстких дисків) | |
15 | IDE Secondary (Контролер жорстких дисків) | |
3 | Com Port 1 (Миша) | |
4 | Com Port 2 (Модем) | |
5 | Вільно | |
S | 6 | Floppy (Дисковод) |
7 | LPT (Принтер) |
Як видно з таблиці, вільних переривань практично не залишилося. Вільним можна вважати тільки IRQ 5 і 10, все інше зайнято. За логікою, саме їх і треба використовувати для відеокарти і аудіоплати. Але пристроїв, що вимагають власне переривання і не описаних в цій таблиці, може бути куди більше. У таблицю вони не включені, так як є опціями, тобто можуть бути в системі, а можуть і не бути. Наприклад: мережева карта, контролер RAID або SCSI, ТБ-тюнер, SATA, IEEE1394 (FireWire) і так далі. Тобто, може скластися ситуація, коли на два вільних переривання буде вісім пристроїв, що вимагають власного переривання. Є три способи вирішення цієї проблеми. Кожен спосіб має свої плюси і мінуси.
Перший спосіб - це повноцінне використання систем ACPI і IRQ Sharing. Якщо системи ACPI, а відповідно і APIC, включені, то операційна система вважає, що у неї 256 переривань, при цьому реальних переривань як було 16, так і залишилося. Решта 240 переривань - це віртуальні переривання, які є клонами реальних. ACPI автоматично розподіляє переривання і не дозволяє користувачеві їх міняти. Якщо пристрій погоджується працювати в режимі кооперації з іншим пристроєм, то є всі шанси, що ACPI посадить їх на одну фізичну лінію. Якщо не контролювати дану ситуацію, то на одному фізичному перериванні можуть виявитися практично всі пристрої, встановлені в комп'ютері, навіть якщо є вільні переривання. Це призведе до сильного гальмування всієї системи і серйозних збоїв в роботі.
Рішення:
Плюс даного підходу у відсутності потреби втручання з боку користувача. Тобто, робити нічого не треба. Просто увіткнути в материнську плату відеоадаптер, процесор, пам'ять і так далі, а потім поставити операційну систему, яка нормально підтримує ACPI. А це Windows XP або Windows 2000. Все. Комп'ютер запрацює. Саме в такому вигляді продаються майже всі комп'ютери, зібрані в Росії. Підхід простий: якщо працює і гальмує - то це не гарантійний випадок, а проблема користувача.
Другий спосіб полягає у відмові від використання ACPI і APIC, але з паралельним використанням IRQ Sharing. Відмова від систем ACPI і APIC означає, що операційна система знає про наявність у неї лише 16 переривань, а не 256, але система IRQ Sharing дозволяє перебувати на одному перериванні кільком пристроям. При цьому відстежувати картину переривань вже можна, і вибирати сусідів на свій розсуд - теж. Тобто, якщо у вас є мережева плата та звукова карта, і при цьому потрібні всі порти введення-виведення встановлені в материнську плату, то від IRQ Sharing вже ніяк не звільнитися.
Рішення:
Сучасні материнські плати мають деякими особливостями, які необхідно знати для коректного розведення ліній переривань по пристроях. Так, всі вбудовані в материнську плату пристрої найчастіше мають жорстку прив'язку до слотів розширення PCI, а деякі слоти жорстко прив'язані один до одного. Наприклад, у вас є вбудована в материнську плату звукова карта, при цьому вона автоматично кооперується з пристроєм в третьому слоті PCI. Якщо ви вставите мережеву плату в третій слот, то вбудована звукова карта і мережева плата будуть висіти на одному перериванні, щоб ви не робили. Вирішити цей конфлікт можна, переставивши мережеву карту в інший слот. Або інший приклад: п'ятий і перший слот PCI прив'язані один до одного, і встановивши два пристрої в ці слоти, ви автоматично вішаєте їх на одну лінію переривання. Знову ж таки, це лікується перевстановлення одного з пристроїв в інший слот. На жаль, сучасні материнські плати мають стільки вбудованих пристроїв, що знайти вільний слот PCI без запаралеленних пристроїв буває неможливо. У цьому випадку все залежить від пристрою.