→ Пошук по сайту       Увійти / Зареєструватися
Знання Асемблер Архітектура

Система переривань

Система переривань будь-якого комп'ютера є його найважливішою частиною, що дозволяє швидко реагувати на події, обробка яких винна виконаються негайно: сигнали від машинних таймерів, натиснення клавіш клавіатури або миші, збої пам'яті і ін. Розглянемо у загальних рисах компоненти цієї системи.

Сигнали апаратних переривань, що виникають в пристроях, що входять до складу комп'ютера або підключених до нього, поступають в процесор не безпосередньо, а через два контроллери переривань, один з яких називається таким, що веде, а другий - веденим (рис. 1.11)

Рис. 1.11. Апаратна організація переривань.

Два контроллери використовуються для збільшення допустимої кількості зовнішніх пристроїв. Річ у тому, що кожен контроллер переривань може обслуговувати сигнали лише від 8 пристроїв. Для обслуговування більшої кількості пристроїв контроллери можна об'єднувати, утворюючи з них віялоподібну структуру. У сучасних машинах встановлюють два контроллери, збільшуючи тим самим можливе число вхідних пристроїв до 15 (7 у ведучого і 8 у веденого контроллерів).

До вхідних виводів Irq1...IRQ7 і Irq8...IRQ15 (IRQ - це скорочення від Interrupt Request, запит переривання) підключаються виводи пристроїв, на яких виникають сигнали переривань. Вихід провідного контроллера підключається до входу INT мікропроцесора, а вихід веденого - до входу Irq2 ведучого. Основна функція контроллерів - передача сигналів запитів переривань від зовнішніх пристроїв на єдиний вхід переривань мікропроцесора. При цьому, окрім сигналу INT, контроллери передають в мікропроцесор по лініях даних номер вектора, який утворюється в контроллері шляхом складання базового номера, записаного в одному з його регістрів, з номером вхідної лінії, по якій поступив запит переривання. Номери базових векторів заносяться в контроллери автоматично в процесі початкового завантаження комп'ютера. Для провідного контроллера базовий вектор завжди дорівнює 8, для веденого - 70h. Таким чином, номери векторів, закріплених за апаратними перериваннями, лежать в діапазонах 8h...Fh і 70h...77h. Очевидно, що номери векторів апаратних переривань однозначно пов'язані з номерами ліній, або рівнями IRQ, а через них - з конкретними пристроями комп'ютера. На рис. 1.11 вказані деякі із стандартних пристроїв комп'ютера, переривань, що працюють в режимі.

Процесор, отримавши сигнал переривання, виконує послідовність стандартних дій, зазвичай званих процедурою переривання. Підкреслимо, що тут йде мова лише про реакцію самого процесора на сигнали переривань, а не про алгоритми обробки переривань, що передбачаються користувачем в програмах обробки переривань.

Об'єкти обчислювальної системи, що беруть участь в процедурі переривання, і їх взаємодія показані на рис. 1.12.

рис. 1.12. Процедура обслуговування переривання.

Самий початок оперативної пам'яті від адреси 0000h до 03ffh відводиться під вектори переривань - чотирьохбайтові області, в яких зберігаються адреси обробників переривань (Обрпр на рис. 1.12). У два старші байти кожного вектора записується сегментна адреса обробника, в два молодші - зсув (відносна адреса) точки входу в обробник. Вектори, як і відповідні ним переривання, мають номери, причому вектор з номером 0 розташовується, починаючи з адреси 0, вектор 1 - з адреси 4, вектор 2 - з адреси 8 і так далі Вектор з номером п займає, таким чином, байти пам'яті від n*4 до n*4+3. Всього у виділеній під вектори області пам'яті поміщається 256 векторів.

Отримавши сигнал на виконання процедури переривання з певним номером, процесор зберігає в стеку виконуваної програми поточний вміст трьох регістрів процесора: регістра прапорів, CS і IP. Два останні числа утворюють повну адресу повернення в перервану програму. Далі процесор завантажує CS і IP з відповідного вектора переривань, здійснюючи, тим самим, перехід на обробник переривання, пов'язаний з цим вектором.

Обробник переривань завжди закінчується командою iret (interrupt return, повернення з переривання), що виконує зворотні дії, - витягання із стека збережених там слів і приміщення їх назад в регістри IP і CS, а також в регістр прапорів. Це приводить до повернення в основну програму в ту саму крапку, де вона була перервана.

Насправді запити на обробку переривань можуть мати різну природу. Окрім описаних вище апаратних переривання від периферійних пристроїв, званих часто зовнішніми, є ще два типи переривань: внутрішні і програмні.

Внутрішні переривання збуджуються ланцюгами самого процесора при виникненні однієї із спеціально обумовлених ситуацій, наприклад, при виконанні операції ділення на нуль або при спробі виконати неіснуючу команду. За кожним з таких переривань закріплений певний вектор, номер якого відомий процесору. Наприклад, за діленням на 0 закріплений вектор 0, а за неправильною командою - вектор 6. Якщо процесор стикається з однією з таких ситуацій, він виконує описану вище процедуру переривання, використовуючи закріплений за цією ситуацією вектор переривання.

Нарешті, ще одним надзвичайно важливим типом переривань є програмні переривання. Вони викликаються командою hit з числовим аргументом, який розглядається процесором, як номер вектора переривання. Якщо в програмі зустрічається, наприклад, команда

int 13h 

то процесор виконує ту ж процедуру переривання, використовуючи як номер вектора операнд команди int. Програмні переривання застосовуються насамперед для виклику системних обслуговуючих програм - функцій DOS і BIOS. З командою int 2in виклику DOS ми вже стикалися в прикладі 1-1 і зустрічатимемося ще багато разів. Надалі будуть також приведені приклади використання команди int для виклику прикладних обробників програмних переривань.

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

Велика частина векторів переривань зарезервована для виконання певних дій; частина з них автоматично заповнюється адресами системних програм при завантаженні системи. Приведемо короткий витяг з таблиці векторів, що дозволяє продемонструвати різноманітність її складу:

  • 00h -внутреннєє переривання, ділення на 0;
  • 0lh -внутреннєє переривання, покрокове виконання (при Tf=1);
  • 02h -немаськируємоє переривання (виведення NMI процесора);
  • 08h -аппаратноє переривання від системного таймера;
  • 09h -аппаратноє переривання від клавіатури;
  • 0eh -аппаратноє переривання від гнучкого диска;
  • 10h - програмне переривання, програми BIOS управління відеосистемою;
  • 13h - програмне переривання, програми BIOS управління дисками;
  • 16h - програмне переривання, програми BIOS управління клавіатурою;
  • Idh -не вектор, адреса таблиці відеопараметрів, використовуваною BIOS;
  • leh -не вектор, адреса таблиці параметрів дискети, використовуваною BIOS;
  • 21h - програмне переривання, диспетчер функцій DOS;
  • 22h - програмне переривання, адреса переходу при завершенні процесу, використовуваний DOS;
  • 23h -программноє переривання, обробник переривань по <Ctrl>/c, використовуваний DOS;
  • 25h - програмне переривання, абсолютне читання диска (функція DOS);
  • 26h - програмне переривання, абсолютний запис на диск (функція DOS);
  • 60h...66h - зарезервовано для програмних переривань користувача;
  • 68h...6Fh - програмні переривання, вільні вектори;
  • 70h -аппаратноє переривання від годинника реального часу (з живленням від акумулятора);
  • 76h -аппаратноє переривання від жорсткого диска;

Як видно із списку, вектори переривань можна умовно розбити
на наступні групи:

  • вектори внутрішніх переривань процесора (0lh, 02h і ін.);
  • вектори апаратних переривань (08h...0Fh і 70h...77h);
  • програми BIOS обслуговування апаратури комп'ютера (10h, 13h, 16h і ін.);
  • програми DOS (21h, 22h, 23h і ін.);
  • адреси системних таблиць BIOS (Idh, leh і ін.).

Системні програми, адреси яких зберігаються у векторах переривань, в більшості своїй є всього лише диспетчерами, що відкривають доступ до великих груп програм, що реалізовують системні функції. Так, відеодрайвер BIOS (вектор 10h) включає програми зміни відеорежиму, управління курсором, завдання колірної палітри, завантаження шрифтів і багато інших. Особливо характерний в цьому відношенні вектор 21h, через який здійснюється виклик практично всіх функцій DOS: введення з клавіатури і виводу на екран, обслуговування файлів, каталогів і дисків, управління пам'яттю і процесами, служби часу і так далі Для виклику необхідної функції треба не тільки виконати команду int з відповідним номером, але і вказати системі в одному з регістрів (для цієї мети завжди використовується регістр АН) номер функції, що викликається. Іноді для "багатофункціональних" функцій доводиться указувати ще і номер підфункції (у регістрі AL).

загрузка...
Сторінки, близькі за змістом