Ноу Інти, лекція, переривання і особливі випадки
Переривання і особливі випадки
Переривання - це зміна природного порядку виконання програми, яке пов'язане з необхідністю реакції системи на роботу зовнішніх пристроїв, а також на помилки і особливі ситуації, що виникли при виконанні програми. При цьому викликається спеціальна програма - обробник переривань. специфічна для кожної ситуації, що виникла, після виконання якої поновлюється робота перерваної програми.
Механізм переривання забезпечується відповідними апаратно-програмними засобами комп'ютера.
Класифікація переривань представлена на рис. 7.1.

Мал. 7.1. Класифікація переривань
Запити апаратних переривань виникають асинхронно по відношенню до роботи мікропроцесора і пов'язані з роботою зовнішніх пристроїв.
Запит від немаскованих переривань надходить на вхід NMI мікропроцесора і не може бути програмно заблокований. Зазвичай цей вхід використовується для запитів переривань від схем контролю харчування або непереборних помилок введення / виведення.
Для запитів маскуються переривань використовується вхід INT мікропроцесора. Обробка запиту переривання по даному входу може бути заблокована скиданням біта IF в регістрі прапорів мікропроцесора.
Програмні переривання. строго кажучи, називаються винятками або особливими випадками. Вони пов'язані з особливими ситуаціями, що виникають при виконанні програми (відсутність сторінки в оперативній пам'яті, порушення захисту, переповнення), тобто з тими ситуаціями, які програміст передбачити не може, або з наявністю в програмі спеціальної команди INT n, яка використовується програмістом для виклику функцій операційної системи або BIOS. підтримують роботу із зовнішніми пристроями. Надалі під час обговорення роботи системи переривань ми будемо вживати єдиний термін "переривання" для апаратних переривань і виключень, якщо це не обумовлено.
Програмні переривання діляться на наступні типи.
Порушення (відмова) - особливий випадок, який мікропроцесор може виявити до виникнення фактичної помилки (наприклад, відсутність сторінки в оперативній пам'яті); після обробки порушення програма виконується з рестарту команди, що призвела до порушення.
Пастка - особливий випадок, який виявляється після закінчення виконання команди (наприклад, наявність в програмі команди INT n або встановлений прапор TF в регістрі прапорів). Після обробки цього переривання виконання програми продовжується з наступної команди.
Аварія (вихід з процесу) - настільки серйозна помилка, що деякий контекст програми втрачається і її продовження неможливо. Причину аварії встановити не можна, тому програма знімається з обробки. До аварій відносяться апаратні помилки, а також несумісні або неприпустимі значення в системних таблицях.
Порядок обробки переривань
Переривання і особливі випадки розпізнаються на кордонах команд, і програміст може не піклуватися про стан внутрішніх робочих регістрів і пристроїв конвеєра.
Реагуючи на запити переривань, мікропроцесор повинен ідентифікувати його джерело, зберегти мінімальний контекст поточної програми і переключитися на спеціальну програму - оброблювач переривання. Після обслуговування переривання МП повертається до перерваної програми, і вона повинна відновитися так, як ніби переривання не було.
Процедура розгляду заяв про переривань складається з:
- "Рефлекторних" дій процесора, які однакові для всіх переривань і особливих випадків і якими програміст управляти не може;
- виконання створеного програмістом обробника.
Для того щоб мікропроцесор міг ідентифікувати джерело переривання і знайти обробник, відповідний отриманим запитом, кожному запиту переривання привласнений свій номер (тип переривання).
Тип переривання для програмних переривань вводиться зсередини мікропроцесора; наприклад, переривання по відсутності сторінки в пам'яті має тип 14. Для переривань, що викликаються командою INT n, тип міститься в самій команді. Для маскуються апаратних переривань тип вводиться з контролера пріоритетних переривань по шині даних. Немаскіруемое переривання призначений тип 2.
Всього мікропроцесор розрізняє 256 типів переривань. Таким чином, всі вони можуть бути закодовані в 1 байті.
"Рефлекторні" дії мікропроцесора з обробки запиту переривання виконуються апаратними засобами МП і включають в себе:
Після цього виконується програма - обробник переривання. відповідна надійшов запит. Ця програма пишеться і розміщується в пам'яті прикладним або системним програмістом. Оброблювач переривання повинен завершуватися командою I RET. по якій автоматично відбувається перехід до продовження виконання перерваної програми з відновленням її контексту.
Для виклику обробника переривання мікропроцесор при роботі в реальному режимі використовує таблицю векторів переривань. а в захищеному режимі - таблицю дескрипторів переривань.
У захищеному режимі для виклику обробника переривання використовується таблиця дескрипторів переривань IDT. Елементами таблиці є 8-байтниє дескриптори типу шлюз -пеціальние програмні структури, через які відбувається передача управління обробнику.

Мал. 7.2. Таблиця векторів переривань

Мал. 7.3. Порядок звернення до таблиці дескрипторів переривань
Вміст регістра IDTr не зберігається в сегментах TSS і не змінюється при перемиканні завдання. Програми не можуть звернутися до IDT. так як єдиний біт TI індикатора таблиці в селекторі сегмента забезпечує вибір тільки між таблицями GDT і LDT.
Максимальна межа таблиці дескрипторів переривань становить 256 * 8 - 1 = 2047.
Можна визначити межу меншим, але це не рекомендується. Якщо відбувається звернення до дескриптора поза межами IDT. процесор переходить в режим відключення до отримання сигналу по входу NMI або скидання.
В IDT можуть зберігатися тільки дескриптори наступних типів:
- шлюз пастки,
- шлюз переривання, шлюз завдання.
Шлюзи пастки і переривання подібні зі шлюзом виклику. тільки в них відсутній поле лічильника WC (рис. 7.4). Так як переривання є несподіваним подією і не пов'язане з поточною програмою, говорити про передачу параметрів їх оброблювачу не доводиться.

Мал. 7.4. Формат шлюзів пастки і переривання
Біт S = 0 в байті доступу визначає цей дескриптор як системний об'єкт. Якщо поле ТИП в байті доступу одно 1110, то це шлюз переривання. якщо 1111 - то шлюз пастки.
Поле рівня привілеїв дескриптора DPL. як правило, встановлюється рівним 3 з тим, щоб до обробника переривань могли звертатися програми з будь-якого рівня привілеїв.
Біт присутності P може дорівнювати як 0, так і 1.
При вході в обробник через шлюз переривання в регістрі прапорів скидається біт дозволу переривань IF. В цьому випадку мікропроцесор блокує всі маскуються апаратні переривання. Тому в обробнику переривань цей біт повинен бути встановлений в 1 якомога раніше з тим, щоб не блокувати роботу програм, які викликаються, наприклад, при обробці переривань від системного таймера.
При вході в обробник через шлюз пастки прапор IF не змінюється.
Виклик обробника через шлюз пастки. а не шлюз переривання, частіше реалізують при обробці виключень. так як на період обслуговування переривання небажано вимикати механізм поділу часу, який використовує переривання таймера.
Виклик обробника через шлюз завдання зазвичай здійснюється при обробці апаратних переривань, так як така обробка не пов'язана з поточною виконуваної завданням. При цьому можливий механізм вкладених переривань, якщо переривання в завданні дозволені. Виклик обробника переривання через шлюз завдання здійснюється і при обробці виключень. наприклад, "недозволений TSS", коли пошкоджена завдання не може викликати процедуру переривання. Перемикання завдань вимагає приблизно в 5 разів більше часу, ніж виклик процедури. Тому, якщо пріоритет запиту високий, а програма обслуговування коротка, її оформляють у вигляді процедури.