Какво се случва, ако бъде повдигнато друго прекъсване, преди да е завършено първото прекъсване?

Този въпрос е от темата за обработка на прекъсвания.

Да предположим, че се обслужва прекъсване. Какво се случва, ако бъде повдигнато друго прекъсване дори преди да е завършено първото прекъсване?


person Community    schedule 31.05.2009    source източник


Отговори (3)


Следното се отнася само за архитектурата x86, но други архитектури може да следват същия модел:

Има процесорен флаг, наречен IF (флаг за прекъсване), който контролира дали хардуерните прекъсвания могат да бъдат обработени или трябва да бъдат поставени в режим на изчакване. Когато IF = 0, прекъсванията ще бъдат отложени, докато флагът се активира отново (с изключение на NMI, немаскируемото прекъсване, което е предвидено като прекъсване „само при спешни случаи“, което не може да бъде блокирано).

IF се изчиства автоматично от процесора, преди да бъде извикана рутинна програма за обслужване на прекъсване. Това е необходимо, за да се предотврати прекъсването на повикванията да излязат извън контрол. Обърнете внимание, че самият обслужващ код за прекъсване не може да направи това сам, защото ако IF не беше деактивиран преди влизане в рутината, би било възможно да се появят повече прекъсвания, преди обслужващият код да има време да изпълни дори една инструкция. След това "пожарен маркуч" от прекъсвания веднага ще доведе до (от всички неща) препълване на стека.

И така, в отговор на вашия директен въпрос: обикновено, когато възникне второ хардуерно прекъсване, докато първоначалното се обслужва, това прекъсване ще бъде задържано, докато първото не приключи.

Както обикновено, цялата история е малко по-сложна. Ръководство за разработчици на софтуер за архитектура на Intel в уеб сайта на Intel сайтът дава по-пълно описание, започвайки от страница 10-4.

person Euro Micelli    schedule 31.05.2009

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

По същия начин, ако се появи втори или следващ екземпляр на първоначалното прекъсване, преди първият манипулатор да завърши, или ако се появи прекъсване с по-нисък или равен приоритет, то ще бъде задържано, докато първият манипулатор завърши. Преди да се възобнови нормалната обработка, ядрото проверява за неизпълнени прекъсвания, които е трябвало да бъдат обработени, но са били блокирани.

Един манипулатор на прекъсвания може да блокира други прекъсвания.

person Jonathan Leffler    schedule 31.05.2009

Е, ако прекъсванията не са били забранени след първото прекъсване, второто ще доведе до повторно извикване на рутинната ви услуга за прекъсване. Трябва да се уверите, че прекъсванията са деактивирани, за да избегнете това определено нежелано поведение.

Така че, ако вашата рутинна услуга за прекъсване върши работата си и след това се появи друго прекъсване, ще бъде точно както ако правите нещо друго: ще бъде извикана съответната рутинна програма за прекъсване.

В архитектурата на Intel инструкцията "cli" ще деактивира прекъсванията, а "sti" ще ги активира отново.

person Mr. Shickadance    schedule 31.05.2009