Тема 17 - Система на прекъсванията

Прекъсвания / Система на прекъсванията


страницата се нуждае от дописване/преглеждане


Програма за обслужване на прекъсването

В класическата фон Нойманова архитектура няма прекъсвания - тя е замислена с последователен вход/изход, polling (последователни "опипвания" на състоянието на шината) и изчакване. С развитието на технологиите обаче се налагат и прекъсвания - например, при асинхронни вход/изход. Системата на прекъсванията трябва да може да прекъсне изпълнението на програмата в произволен момент и да извика програмата за обслужване на прекъсването, която да замени текущата програма, а след завършека на нейното изпълнение да се възстанови прекъснатата програма така, че от нейна гледна точка нищо да не се е случило. По този начин се "залъгва" фон Ноймановата последователност, тъй като прекъсванията са прозрачни за прекъсваната програма.

В началото е съществувало само последователното, съвместимо с фон Ноймановите идеи процедурно програмиране. Впоследствие се появава модулното, а след това и обектно-ориентираното програмиране, като последното е най-"тежко" по отношение използването на хардуеъра, защото ОО е външен слой, който също се преобразува в последователен процедурен код.

Последователният код образува свой изчислителен процес. В ЦП всеки процес образува свой контекст - временно състояние на общите програмно достъпни регистри на процесора. При прекъсване на процес, контекстът на процеса в ЦП трябва да се съхрани в момента на прекъсването, след което се извиква (активира) програма за обслужване на прекъсването. След завършване на нейното изпълнение прекъснатата програма трябва да продължи от състоянието, в което е прекъсната - контекстът трябва да се възстанови. За това се грижи системата на прекъсванията.
Обемът на контекста, който трябва да се запази, не е еднакъв за всички прекъсвания. Минималният контекст се състои от флаговия регистър (FLAGS / EFLAGS - 16 / 32-битов системен регистър ) и програмния брояч (IP/PC). Той се запазва при всички прекъсвания; останалите регистри се запазват в едни случаи, в други не.

Източници на прекъсване

Има класификация на петте основни типа прекъсвания1:

1. Прекъсване по машинна грешка

Прекъсването се предизвиква от схемите за контрол на хардуера. При извършване на изчисления, освен изчислителни блокове като броячи и суматори, работят и други хардуерни елементи - схеми за контрол. Пример за това е схемата за контрол на АЛУ. Всяко АЛУ всъщност е двойно (не става дума за суперскаларна конфигурация), като, например, при събиране, едното АЛУ изчислява "правото" събиране, а другото - "обратното", и двете се сравняват. Всички линии за данни имат контролни линии, по които се пренасят контролни битове. За осем линии данни, например, има девета, контролна линия. Контрол се извършва предимно по четност (Parity) или нечетност (Non-Parity), като стандартно е да се извършва по нечетност - ако в изведения по осемте линии резултат има четен брой единици, контролният бит е със стойност 0, и обратно.
Има нови процесори, в които, вместо второ АЛУ, се използва FPU (устройство за работа с числа с плаваща запетая).
В ЦП има и други, по-сложни схеми за контрол, но като цяло, те не са много схеми за контрол, за да бъде по-лесен (и съответно по-евтин) за производство. За разлика от него, във външните устройства има повече схеми за контрол, които следят за грешки. Ако открият такива, се изпраща сигнал по линия, която хардуерно (жично) се събира с други такива линии от други устройства и влиза в линията NMI (Non-Maskable Interrupt) на ЦП.
При overclocking се повишава вероятността за машинна грешка.
Прекъсването по машинна грешка е най-привилегированото прекъсване.

Пример:
Схема за контрол на АЛУ – при пресмятането на някаква операция в АЛУ,операцията минава през двойна проверка - веднъж през контролно АЛУ и след това се изпълнява от самото АЛУ.

2. Входно/Изходно прекъсване

Източник на такова прекъсване е външен контролер. Подава се, когато завърши входно-изодна операция, зададена от ЦП.

3. Програмни прекъсвания

Програмни прекъсвания възникват от невъзможност да бъде изпълнена някоя стъпка от цикъла на командата. Практически всяка стъпка може да не бъде изпълнена, затова ЦП преди изпълнение на предстоящата прави проверка дали има условия за нейното изпълнение. Ако не - емулира сигнал за програмно прекъсване. Софтуерният обработчик разпознава причината и маркира 2 байта код за грешката в PSW.

Пример:
Немаскируемо прекъсване при деление на 0 в програмта.
Немаскируемо прекъсване – винаги се изпълнява.
Друг случай:
На ЦП е указано, че двата адреса на операндите са с определени граници (подравнени по границата на дума, двойна дума, четворна, и т.н.). Ако единият адрес на операнда не отговаря на границата, то тогава настъпва програмно прекъсване.
Маскируемо прекъсване – може да се изпълни, или да не се изпълни. .
Пример: Overflow – при събиране на две големи положителни числа се получава малко отрицателно число, но това може да се маскира и програмно да не прекъсне.

4. Външно прекъсване

Извън процесора.
Пример: При натискане на бутона Reset на компютъра.

5. Изкуствени прекъсвания

Указани в програмата.

Това подреждане на източниците на прекъсвания съответства на техния приоритет.

Вложени прекъсвания (Nested Interruptions)

Може да се случи така, че по време на обслужване на прекъсване да се случи ново прекъсване от същия тип - например, докато се обработва входно-изходно прекъсване, да се извика ново такова. В такъв случай, се налага да се обработи новото прекъсване, а след това да се продължи с предишното. За целта обаче трябва да се запази контекстът преди второто прекъсване, който не трябва да се записва върху контекста преди първото. Освен това, в някои случаи не трябва да се позволява на дадено прекъсване да се изпълни, ако в ход е обработката на предишно прекъсване.
За да се решат тези проблеми, биват измислени схема за маскиране на прекъсванията и различни механизми за обслужването им.

Схема за маскиране в Intel

shema%20za%20maskirane%20w%20intel.jpg

Контролер на прекъсванията
IRQ – Interrupt Request (0..15) – това са 16 линии за В/И прекъсвания. Първоначално линиите са били 8; след като се е наложило да се следи за повече прекъсвания, линия 2 се отделя за разширение и към нея по начина, показан на схемата, се включват нови 8 линии: IRQ 8 - 15. Редът на линиите определя техния приоритет – малък номер, голям приоритет. Като отчетем, че линия 2 е за разширение, приоритетите им са, както следва:
0 > 1 > [8 > 9 > 10 > 11 > 12 > 13 >14 > 15] > 3 > 4 > 5 > 6 > 7

IRQ0 – прекъсване при refresh на паметта.
IRQ1- прекъсване от клавиатурата.
IRQ8 – IRQ15 – прекъсвания от дискове (това са по-важните прекъсвания).
IRQ3 – IRQ7 – прекъсвания на модеми, принтери (по-бавни периферни устройства).

INTA – Interrupt Acknowledgement
След като се подаде заявка за прекъсване на ЦП, той изпраща отговор (INTA), ако е приел прекъсването и ще го обработи. Intel-ските процесори имат 1 вход за получаване на прекъсвания и 1 изход за потвърждаването им (показано на схемата). След като процесорът приеме прекъсването, в него има апарат (схема) за обслужване на прекъсването по някакъв определен механизъм.

Код на прекъсване - Interrupt Code (IC)
След връщане на INTA сигнал устройството, на което е разрешено прекъсването, изпраща IC - 8-битов код на прекъсване. По този код ЦП търси програмата за обслужване на приетото прекъсване, от съответна заявка IRQ. В паметта се помнят 256 вектора на прекъсване. Всеки вектор съдържа адрес на програма.
В/И прекъсвания се идентифицират по различен начин с различни кодове, т.е. различни вектори на прекъсване. Всички прекъсвания по машинна грешка са свързани към един вектор на прекъсване, защото прекъсванията по машинните грешки са разположена в логическа схема с логически връзки „или”.

NMI - Non-Maskable Interrupt

Механизми за обслужване на прекъсванията

Механизъм с фиксирани адреси в паметта

interruptions1.png
Първо се определя типът на прекъсването. В зависимост от определения тип, ЦП запазва текущия контекст на програмата в старо състояние преди да настъпи прекъсването, след което се въвежда нова стойност на програмния брояч (PC/IP). Впоследствие, за обработка на вложени прекъсвания, схемата се доразвива: когато имаме прекъсване в прекъсване, за да се избегне изтриване на стар контекст, се използват списъчни структури.

Механизъм със стек

interruptions2Stack.png
Контекста на текущия процес се помни във върха на стека, а контекста на прекъсването се помни във вектора на прекъсванията. Програмата, която обслужва прекъсването винаги завършва с инструкцията IRET (…. Return) като взима текущия контекст от върха на стека. Този механизъм е по-удобен за вложени прекъсвания (Nested Interruptions).
VAX компютрите работят с 5 стека за обслужване на прекъсванията.

Пример за обслужващи програми на прекъсванията:
Драйвърите обслужват В/И прекъсвания.

Недостатъци на Intel по отношение на прекъсванията

Голям недостатък при Intel-ските процесори, що се отнася до обслужване на прекъсванията е, че липсват отделни състояния на ЦП – режим supervisor / user. В процесорите, в които има такова разделение2, за да се изпълнят определени високоприоритетни прекъсвания, е нужно да се мине в режим supervisor. Това повишава сигурността на работа на системата - става много по-трудно такъв процесор да се "завируси".

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License