Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Theme08.doc
Скачиваний:
9
Добавлен:
20.12.2018
Размер:
133.12 Кб
Скачать

4. Узагальнена процедура обробки переривання.

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

  1. У стек поміщається регістр флагів PSW.

  2. Флаг включення/вимикання переривань IF і флаг трасування TF, що знаходяться в регістрі PSW, обнуляются для блокування інших маскованих переривань і виключення покрокового режиму виконання команд.

  3. Значення регістрів CS і IP зберігаються в стеці слідом за PSW.

  4. Обчислюється адреса вектора переривання, і з вектора, який відповідає номеру переривання, завантажуються нові значення IP і CS.

Коли системна підпрограма приймає керування, вона може знову дозволити масковані переривання командою STI (set interrupt flag, установити флаг переривань), що переводить флаг IF у стан 1, що дозволяє мікропроцесору знову реагувати на переривання, ініціалізовані зовнішніми пристроями, оскільки стекова організація дозволяє вкладення переривань одне в одного.

Закінчивши роботу, підпрограма обробки переривання повинна виконати інструкцію IRET (interrupt return), що витягає зі стека три 16-бітових значення і завантажує їх у покажчик команд IP, регістр сегмента команд CS і регістр PSW відповідно. Таким чином, процесор зможе продовжити роботу з того місця, де він був перерваний.

У випадку зовнішніх переривань процедура переходу на підпрограму обробки переривання доповнюється наступними кроками:

  1. Контролер переривань одержує заявку від визначеного периферійного пристрою і, дотримуючи схеми пріоритетів, генерує сигнал INTR (interrupt request), що є вхідним для мікропроцесора.

  2. Мікропроцесор перевіряє флаг IF у регістрі PSW. Якщо він встановлений у 1, то переходимо до кроку 3. У противному випадку робота процесора не переривається. Часто говорять, що переривання замасковані, хоча вірніше говорити, що вони відключені. Маскуються (забороняються) окремі лінії запиту на переривання за допомогою програмування контролера переривань.

  3. Мікропроцесор генерує сигнал INTA (підтвердження переривання). У відповідь на цей сигнал контролер переривання посилає по шині даних номер переривання. Після цього виконується описана нами раніше процедура передачі керування відповідній програмі обробки переривання.

Номер переривання і його пріоритет установлюються на етапі ініціалізації системи. Після запуску ОС користувач, як ми уже відзначали, може змінити таблицю векторів переривання, оскільки вона йому доступна.

5. Робота системи переривань у захищеному режимі роботи процесора.

У захищеному режимі роботи система переривань діє зовсім інакше. Насамперед, система переривань мікропроцесора i80x86 при роботі в захищеному режимі замість таблиці векторів, про яку ми говорили вище, має справу з таблицею дескрипторів переривань (IDT, interrupt descriptor table). Справа тут не стільки в назві таблиці, скільки в тім, що таблиця IDT являє собою не таблицю з адресами оброблювачів переривань, а таблицю зі спеціальними системними структурами даних (дескрипторами), доступ до якої з боку користувацьких (прикладних) програм неможливий. Тільки сам мікропроцесор (його система переривань) і код операційної системи можуть одержати доступ до цієї таблиці, що являє собою спеціальний сегмент, адреса і довжина якого містяться в регістрі IDTR (див. мал. 3.2). Цей регістр аналогічний регістру GDTR у тім відношенні, що він ініціалізується один раз при завантаженні системи. Цікаво помітити, що в реальному режимі роботи регістр IDTR так само вказує адресу таблиці переривань, але при цьому, як і в процесорі і8086, кожен елемент таблиці переривань (вектор) займає всього 4 байти і містить 32-бітну адресу у форматі селектор:зсув (CS:IP). Початкове значення цього регістра дорівнює нулю, але в нього можна занести й інше значення. У цьому випадку таблиця векторів переривань буде знаходитися в іншому місці оперативної пам'яті. Природньо, що перед тим, як це зробити (занести в регістр IDTR нове значення), необхідно підготувати саму таблицю векторів. У захищеному режимі роботи завантаження регістра IDTR може зробити тільки код з максимальним рівнем привілеїв. Кожен елемент у таблиці дескрипторів переривань, про яку ми говоримо вже в захищеному режимі, являє собою 8-байтову структуру, більш схожу на дескриптор шлюзу (gate), ніж на дескриптор сегмента. Як ми вже знаємо, у залежності від причини переривання процесор автоматично індексує таблицю переривань і вибирає відповідний елемент, за допомогою якого і здійснюється перенапрямок у виконанні коду, тобто передача керування на оброблювач переривання. Однак таблиця IDT містить тільки шлюзи, а не дескриптори сегментів коду, тому фактично виходить непряма адресація, але з використанням розглянутого раніше механізму захисту за допомогою рівнів привілею. Завдяки цьому користувачі вже не можуть самі змінити обробку переривань, що визначається системним програмним забезпеченням.

Дескриптор переривань може належати до одного з трьох типів:

  • комутатор переривання (interrupt gate);

  • комутатор перехоплення (trap gate);

  • комутатор задачі (task gate).

При виявленні запиту на переривання і за умови, що переривання зараз дозволені, процесор діє в залежності від типу дескриптора (комутатора), що відповідає номеру переривання. Перші два типи дескриптора переривань викликають перехід на відповідні сегменти коду, що належать віртуальному адресному простору поточного обчислювального процесу. Тому про них говорять, що обробка переривань по цих дескрипторах здійснюється під контролем поточної задачі. Останній тип дескриптора — комутатор задачі — викликає повне переключення процесора на нову задачу зі зміною всього контексту відповідно до сегмента стану задачі (TSS). Розглянемо ці варіанти.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]