4. Организация на прекъсванията в компютъра

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

Можем да мислим за процесора като преместващ вниманието си от устройство на устройство и функция на функция. Това, на което процесорът обръща внимание във всеки един момент, се определя от програмата, която изпълнява.

По време на работа процесорът получава (и произвежда сам) голям брой различни сигнали. Сигналите, които програмата, работеща в процесора, може да възприеме, обработи и вземе предвид, съставляват зрителното поле на процесора или, с други думи, влизат в зоната на неговото внимание.

За да може процесорът, докато изпълнява своята работа, да може да реагира на събития, възникващи извън неговата зона на внимание, чието възникване той „не очаква“, има система от компютърни прекъсвания.При липса на система от прекъсвания, всички събития, заслужаващи внимание, трябва да бъдат в зрителното поле на процесора, което значително усложнява програмите и изисква голямото им резервиране. Освен това, тъй като моментът на възникване на събитие не е известен предварително, процесорът може да чака събитие дълго време и за да не пропусне появата му, процесорът не може да бъде „разсеян“ за извършване на друга работа. Този режим на работа (режим на сканиране на изчаквано събитие) е свързан с голяма загуба на процесорно време в чакане.

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

Прекъсване (английски interrupt)- сигнал, който информира процесора за настъпването на събитие. В същото време изпълнението на текущата последователност от команди се преустановява и контролът се прехвърля към манипулатора на прекъсвания, който реагира на събитието и го обслужва, след което връща контрола на прекъснатия код

Принципът на работа на системата за прекъсване е както следва:

когато програмата се изпълнява, след всеки работен цикъл на микропроцесора се променя съдържанието на регистрите, броячите, състоянието на отделните тригери за управление, т.е. състоянието на процесора се променя. Информацията за състоянието на процесора е в основата на много процедури за управление на изчислителния процес. Не всяка информация е еднакво уместна, има съществени елементи, без които е невъзможно да продължим работата. Тази информация трябва да се записва при всяко „превключване на вниманието на процесора“.

Наборът от стойности на най-значимите информационни елементи се наричавектор на състоянието или дума за състояние на процесора(в някои случаи се нарича дума за състояние на програмата).

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

Векторът на състоянието се формира в съответния регистър на процесора или в група регистри, които могат да се използват за други цели.

В зависимост от източника на сигнала за прекъсване те се делят на:

асинхронни или външни (хардуерни) - събития, които идват от външни източници (например периферни устройства) и могат да възникнат във всеки произволен момент: сигнал от таймер, мрежова карта или дисково устройство, натискане на клавиши на клавиатурата, движение на мишката;

софтуер (особен случай на вътрешно прекъсване) - инициира се от изпълнението на специална инструкция в програмния код. Софтуерните прекъсвания обикновено се използват за достъп до функциите на фърмуера, драйвера и операционната система.

В зависимост от възможността за забрана на външни прекъсвания, те се разделят на:

maskable - прекъсвания, които могат да бъдат деактивирани чрез задаване на съответните битове в регистъра за маскиране на прекъсвания (в x86 процесори - чрез нулиране на флага IF в регистъра на флаговете);

немаскируеми (на английски Non maskable interrupt, NMI) - винаги се обработват, независимо от забраните за други прекъсвания. Например, такова прекъсване може да причини повреда в чипа с памет.

Манипулаторите на прекъсванияобикновено са написани по такъв начин, че времето им за обработка да е възможно най-кратко, тъй като други прекъсвания може да не бъдат обработени, докато се изпълняват, и ако има много от тях (особено от един източник), тогава те могат да бъдат загубени.

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

Времето за реакция е времето между появата на сигнала за искане на прекъсване и началото на изпълнението на програмата за прекъсване (манипулатор на прекъсване), ако прекъсването е разрешено за обслужване.

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

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

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

Времето за отговор се определя за заявката с най-висок приоритет.

Дълбочина на прекъсване - максималният брой програми, които могат да прекъсват една друга. Дълбочината на прекъсване обикновено е същата като броя на нивата на приоритет,прекъсвания, разпознати от системата. Работата на системата за прекъсване при различни дълбочини на прекъсване (n) е показана на фиг. 14.2. Тук се приема, че с увеличаване на броя на заявката за прекъсване, нейният приоритет нараства.

прекъсванията

Фиг. 14.2.Работа на системата за прекъсване с различна дълбочина на прекъсване

Хардуерен отговор на NMI.

Отговор на софтуерно прекъсване.

Действията, извършвани в режим на затворено прекъсване, обикновено се наричат ​​минимален софтуерен отговорна прекъсване. По правило минималният програмен отговор включва следните действия.

  • Извършват се най-необходимите действия, свързани с настъпилото събитие. Например, ако клавиш на клавиатурата е натиснат или освободен, тогава това трябва да бъде фиксирано някъде (например, запомнете в опашката от знаци, въведени от клавиатурата). Ако това не е направено на етапа на минимална реакция и се отворят прекъсвания, тогава процедурата на манипулатора може да бъде прекъсната за дълго време от нов сигнал, който ще превключи към друга процедура на манипулатор, по време на която може вече да е натиснат друг клавиш и по този начин информацията за предишния натиснат клавиш ще бъде загубена.

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

След завършване на пълната обработка на сигнала за прекъсване, манипулаторната процедура трябва да върне управлението на програмата, прекъсната от последния сигнал за прекъсване. За да направите това, първо трябва да възстановите стойността на всичките му регистри от контекста на прекъснатата програма (с изключение на регистрите FLAGS, CS и IP). След това трябва да се върнете към следващата команда на прекъснатата програма, за която можете да използвате специална команда на машинен език в нашия компютър - командата за излизане от прекъсване

INT(тип прекъсване)

int 21h ;DOS извикване за изпълнение

Инструкцията IRET (връщане на прекъсване) връща контрола до точката, от която е извикано прекъсването, попълвайки IP, CS и регистрите на флага от стека. Инструкцията IRET се използва за излизане както от софтуерни, така и от хардуерни процедури за прекъсване.

Инструкцията DAA (Decimal Addition Correction) променя съдържанието на регистъра AL до правилно опаковано десетично число след предишната инструкция за добавяне. Инструкцията DAA променя стойността на флаговете AF, CF, PF, SF и ZF; съдържанието на OF флага след изпълнението на DAA инструкцията е недефинирано.

Инструкцията AAS (Adjust Unpacked Decimal Subtraction) коригира резултата от предишно изваждане на две валидни неопаковани десетични числа. Операндът местоназначение в инструкцията за изваждане трябва да бъде регистър AL. Инструкцията AAS преобразува стойността в AL във валидно неопаковано десетично число; високата хапка е настроена на нула. Ако резултатът от изваждането е по-малък от 0, съдържанието на регистъра AH се намалява. AAS засяга флаговете AF и CF; Стойността на флаговете OF, PF, SF и ZF след изпълнение на командата AAS е недефинирана.