Процедуры обработки прерываний
Таблица векторов прерываний
Любой процессор Intel, работающий в реальном режиме, способен реагировать ровно на 256 типов событий, называемых прерываниями. При возникновении прерывания CPU, закончив выполнение текущей инструкции "забывает про все свои дела", сохраняет их состояние, что бы потом их про- должить, и переходит к выполнению задачи, предписываемой ему возникшим прерыванием.
Для этого CPU, определив какое прерывание произошло, обращается по соответствующему этому прерыванию адресу практически в начало адресного пространства. Оттуда он берет адрес памяти (вектор прерывания) — место, где находится программа, это прерывание обрабатывающая (обработчик прерывания), и начинает ее выполнять.
Процессор Intel говорит: прочтите адрес из 75 строки специальной таблицы, называемой таблицей векторов прерываний (Interrupt Vector Table--IVT) и следуйте туда. Там вы найдете программу — обработчик этого прерывания.
Такая схема имеет несколько преимуществ, главное из которых — возможность "на лету" менять обработчик любого прерывания. Достаточно лишь поменять значение соответствующей строки таблицы, поместив в нее адрес начала собственной программы-обработчика данного прерывания, и отныне реакцией CPU на это прерывание будет отработка вашей программы.
В реальном режиме первые 1024 байта совпадают с первыми 1024 байтами физического адресного пространства. В защищенном режиме, а также режиме V86, таблица векторов прерываний находится в первом килобайте линейного адресного пространства, которому может соответствовать совершенно произвольная область физического адресного пространства.
Как возникают прерывания
Исходя из обычной логики можно подумать, что прерывания — это реакция на какие-то внешние события. На самом деле, в компьютерах прерывания возникают по скольким причинам. Некоторые прерывания возникают из-за внешних событий. Другие — потому что так определено в программе. Остальные—потому что CPU определяет, что должно произойти прерывание.
Таким образом все прерывания подразделяют на Аппаратные и Программные.
Аппаратные прерывания
Если какое-то устройство хочет обратить на себя внимание CPU, оно генерирует аппаратное прерывание. Например, после каждого нажатия клавиши на клавиатуре, контроллер клавиатуры генерирует специальное аппаратное прерывание, заставляющее CPU отвлечься от своего текущего занятия и должным образом обработать это нажатие.
Сообщить CPU о возникновении аппаратного прерывания можно по одному из следующих двух его выводов: INTR, на который приходит сигнал--запрос на нормальное аппаратное прерывание, и NMI который приходит сигнал-запрос на немаскируемое аппаратное прерывание.
На материнской плате любого PC расположен так называемый контроллер прерываний. В самых первых PC и PC XT у контроллера прерываний было восемь линий, по которым ему приходили сигналы от различных устройств, в ответ на которые он посылал CPU запрос на прерывание. После чего, получив от CPU подтверждение о приеме сигнала, контроллер прерывания сообщал CPU, от которого из восьми потенциальных источников прерываний пришел этот запрос. В PC AT и во всех остальных моделях, появившихся позже, число входов в контроллер прерываний увеличилось с 8 до 15/16. Так говорят 15 или 16 из-за того, что один из входов используется для объединения сигналов от 8 других, но в некоторых ситуациях он может использоваться и по своему прямому назначению.
Эти входы в контроллер прерываний называются линиями запроса на прерывание или линиями IRQ. Всего есть 16 линий, 9 из которых забирает шина ввода-вывода. По этим 9 линиям устройства, вставленные в слоты шины ввода-вывода, могут потребовать для себя внимание CPU. Оставшиеся линии IRQ отданы различным устройствам на материнской плате, например, контроллеру клавиатуры.
Различие между нормальными и немаскируемыми прерываниями заключается в следующем: получив запрос на нормальное прерывание, процессор может проигнорировать его, если ранее им была получена инструкция игнорировать прерывания. Факт возникновения прерывания запоминается, а его обработка откладывается до тех пор, пока у процессора не появится такая возможность. Немаскируемые прерывания используются в ситуациях, когда задержка невозможна. Это похоже на сигнал тревоги. Схема перезагрузки пользуется немаскируемым прерыванием, чтобы достучаться до процессора, несмотря на все его намерения не отвлекаться и работать. Даже если до этого на все обычные прерывания процессор отвечал отказом, запрос на немаскируемое прерывание он обязан обслужить.
Программные прерывания
Благодаря програм-ым прерываниям, любая программа по ходу выполнения может иници- ировать прерывание. Тогда выполнение этой программы прервется, и начнет выполняться обработчик инициированного прерывания, после чего процессор вновь займется программой.
Исключения CPU
Помимо двух вышеперечисленных типов прерываний, Intel сочла удобных использовать этот механизм для обработки проблем, обнаруживаемых сами у CPU. Например, если какая-то программа попытается обратиться к области памяти, на доступ к которой у нее нет никаких прав — так называемая общая ошибка защиты, CPU генерирует соответствующее прерывание. В ответ на это обработчик прерывания может вывести наэкран диалоговое окно, сообщающее пользователю о некорректных действиях программы, после чего обработчик может принудитель- но завершить его выполнение.
Процедуры обработки прерываний
Программа, выполняемая в случае возникновения прерывания, называется процедурой обработки прерывания (interrupt service routine — ISR) или просто обработчиком прерывания. Один и тот же обработчик может обслуживать все 256 возможных прерываний или, наоборот, для каждого прерывания можно предусмотреть свой обработчик. В реальности используется смешанный подход. Есть обработчики, обслуживающие только одно прерывание, и есть обработчики, обслуживающие сразу несколько прерываний.
Будучи вызванным, обработчик прерывания работает до своего завершения, после чего выполняет специальную инструкцию возвращения из прерывания---IRET. Для CPU эта инструкция означает: продолжай делать то, что ты делал до этого.
Самый простой обработчик прерывания состоит из одной инструкции IRET. Такой обработчик по сути дела не делает ничего. Поместив эту инструкцию в память и изменив адреса в таблице векторов прерываний на адрес этой инструкции, можно очень легко игнорировать ненужные прерывания.