
- •Лабораторна робота n6
- •Зміст роботи
- •Довідкові дані
- •Суть переривань від зовнішніх пристроїв.
- •Використання апаратних переривань, пріоритети.
- •Вимоги до процедур обробки переривань.
- •"Перехоплення" переривань.
- •Повторне входження
- •Організація однопроцесорних мультипрограмних систем.
- •Порядок виконання роботи.
- •Ознайомлення з прикладом організації обробки переривань від зовнішніх пристроїв
- •Ознайомлення з прикладом організації мультипрограмного режиму
- •Виконання варіанту завдання
- •Послідовність дій для зупинки задачі.
- •Послідовність дій для зняття задачі з виконання.
- •Початковий модуль моделі мультипрограмної системи
- •Int 21h ; закінчити роботу
- •Завдання на лабораторну роботу.
- •Питання для перевірки:
Вимоги до процедур обробки переривань.
Вміст всіх регістрів, включаючи сегментні регістри на початку роботи процедури вважаються невизначеними, так як в загальному випадку може бути перервана яка завгодно програма після якої завгодно команди, де переривання дозволені. Виключенням з цього правила є регістри SS та SP, оскільки в механізмі переривання використовується стек перерваної програми.
Вміст всіх РЗП, а також сегментних регістрів, які використовуються в процедурі, повинен бути збережений (наприклад в стеці). Якщо в процедурі обробки переривань необхідно використовувати значний розмір стека, то необхідно перейти на свій стек, оскільки в перерваній програмі значний розмір стека може бути не передбачений. Перед поверненням з процедури обробки переривань необхідно відновити вміст регістрів. Якщо використовувався свій стек, то необхідно перейти на стек перерваної програми.
ЗАУВАЖЕННЯ. Перехід на новий стек означає виконання команди (команд) завантаження вмісту регістрів SS та SP
При переході на процедуру обробки переривань if=0, тому необхідно, по можливості, чим скоріше виконати команду STI (встановить if=1), яка дозволить переривання самої процедури обробки переривань. Це необхідно для забезпечення нормальної роботи комп'ютерної системи. Пріоритетність переривань від зовнішніх пристроїв визначається, як відзначалось вище, допустимим часом реакції і встановлюється операційною системою шляхом програмування контролера переривань. Непродумане блокування переривань (при if=0 блокуються переривання любих пріоритетів) може призвести до перевищення часу реакції над максимально допустимим, особливо для найбільш пріоритетних зовнішніх пристроїв.
Контролер переривань запам'ятовує факт подання на процесор чергового вектора переривань і блокує формування сигналу запитів на переривання того самого або нижчого рівнів пріоритету. Виконання команди IRET (закінчення процедури обробки переривання) розблокування не виконує. Тобто і надалі переривання того самого і нижчого рівня пріоритету будуть заблоковані. Це означає, що надалі заблоковані будуть і переривання від зовнішнього пристрою, який тільки що був обслужений. Для розблокування необхідно послати на контролер відповідні дані. Такими даними є код 20h, який в ПЕОМ необхідно подать на порт з адресою 20h, наприклад
Mov al,20h
Out 20h,al
"Перехоплення" переривань.
Операційні системи мають в своєму складі процедури обробки переривань від усіх стандартних зовнішніх пристроїв ПЕОМ. При роботі програм операційної системи встановлюються відповідні вектори в таблиці векторів переривань. В реальному режимі процесорів 80х86 та Pentium інші програми мають можливість безпосереднього доступу як до зовнішніх пристроїв так і до таблиці векторів переривань. Нехай, наприклад, користувач бажає самостійно вводить дані з клавіатури ПЕОМ (N=9). Він повинен створити власну процедуру обробки переривань від клавіатури (нехай вона має назву Userint9), зберегти серед своїх даних системний вектор переривань від клавіатури та записати свій. По закінченню роботи своєї програми необхідно відновити системний вектор. Вказані дії можуть бути виконані, наприклад, наступним чином
Xor ax,ax
Mov gs,ax
Mov si,9*4
Mov eax,gs:[si]
Mov syst_vec_9,eax ; збереження системного вектора
Mov x,offset userint9
Mov gs:[si],ax ;встановити зміщення процедури
;користувача в векторі переривань
Mov ax,seg userint9
Mov gs:[si+2],ax ;встановити сегментну складову логічної
;адреси процедури користувача
;в векторі переривань
...
...
Mov eax,syst_vec_9
Mov si,9*4
Mov gs:[si],eax ;відновлення системного вектора
Розглянутий приклад організації перехоплення переривань має той недолік, що "перехоплення" відбувається "за спиною" операційної системи. В результаті операційна система не повідомлена про проведене "перехоплення" і може його трактувати як пошкодження таблиці векторів переривань з примусовим відновленням "правильного" вектора. Щоб цього не сталось в MS-DOS реалізовані спеціальні функції для одержання вектора переривань (функція 35h) та встановлення вектора переривань (функція 25h). За допомогою цих функцій MS-DOS веде облік "перехоплених" переривань. Приклад використання таких функцій з детальними коментаріями наведений в моделі багатопрограмної системи (процедури Setint8, Setint9). По закінчені своєї роботи програма користувача повинна відновити системні вектори переривань (процедури Retin8, Retint9).
При перехопленні переривань можливі наступні варіанти організації процедури користувача та її взаємодії з системною процедурою.
По першому із них системна процедура обробки переривань не використовується, а процедура користувача повністю бере на себе всі дії по обслуговуванню зовнішнього пристрою. До таких дій належать подання на зовнішній пристрій необхідних команд управління для проведення та завершення сеансу зв'язку, що потребує вивчення алгоритму функціонування зовнішнього пристрою. Крім того на контролер переривань необхідно подать згідно з п.2.3.4 команду розблокування переривань поточного та нижчого пріоритетів. Вказані дії виконані в процедурі Userint9 при введені з клавіатури символу Esc. При цьому системна процедура обробки переривань від клавіатури не викликається, тобто від операційної системи "приховується" факт натиснення клавіші Esc. При самостійній роботі з клавіатурою необхідно сформувати імпульс, який подається на клавіатуру (через 7-й розряд порту 61h) і який інформує клавіатуру про завершення введення даних. Без такого імпульсу подальша робота клавіатури буде заблокована.
В другому варіанті мінімізується вплив процедури користувача на обробку переривань від зовнішнього пристрою. Тобто, по стану зовнішнього пристрою процедура користувача визначає, що черговий сеанс зв'язку з зовнішнім пристроєм її не стосується, а тому необхідно передати управління системній процедурі обробки переривання від даного зовнішнього пристрою. Управління на системну процедуру передається за допомогою команди JMP, забезпечуючи тим самим повернення в перервану програму безпосередньо із системної процедури. В процедурі Userint9 даний варіант реалізується при натисканні любої клавіші клавіатури крім клавіші Esc. Якщо натиснута люба друга клавіша, то процедура користувача тільки "спостерігає" за зовнішнім пристроєм, а всі дії покладаються на системну процедуру.
Третій варіант характеризується як безумовним виконанням системної процедури обробки переривань так і безумовним виконанням досить складної користувацької процедури. Прикладом може бути обробка переривань від таймера. Відключення системної процедури обробки переривань від таймера може призвести до збоїв в роботі операційної системи. Крім того, системна процедура повинна виконуватись в першу чергу, щоб унеможливити потенційний вплив користувацької процедури на періодичність ініціалізації системної процедури. Таким чином системна процедура повинна бути негайно викликана із користувацької процедури з поверненням по команді IRET із системної процедури в користувацьку. При цьому системна процедура виконає всі стандартні дії із відповідними зовнішніми пристроями, включаючи контролер переривань, а користувацькій процедурі залишиться виконання лише своїх особливих функцій.