Лекция: Обработчики прерываний

Для большинства опера­ций ввода-вывода прерывания являются неприятным, но необходимым фактом. Прерывания должны быть упрятаны как можно глубже во внутренностях операци­онной системы, чтобы о них знала как можно меньшая часть операционной систе­мы. Лучший способ спрятать их заключается в блокировке драйвера, начавшего операцию ввода-вывода, вплоть до окончания этой операции и получения преры­вания. Драйвер может заблокировать себя сам, выполнив на семафоре процедуру down, процедуру wait на переменной состояния, процедуру receive на сообщении, или что-либо подобное.

Когда происходит прерывание, начинает работу обработчик прерываний. По окончании необходимой работы он может разблокировать драйвер, запустивший его. В некоторых случаях используется выполнение процедуры up на семафоре.

В других случаях обработчик прерываний вызывает процедуру монитора signal с переменной состояния. В третьем случае он посылает заблокированному драй­веру сообщение. В любом случае драйвер разблокируется обработчиком прерыва­ний. Эта схема лучше всего работает в драйверах, являющихся процессами ядра со своим собственным состоянием, стеком и счетчиком команд.

Конечно, в действительности все обстоит совсем не так просто. Обработать пре­рывание значительно сложнее, чем просто принять его, выполнить up на семафо­ре, после чего вернуться из прерывания в предыдущий процесс с помощью коман­ды процессора IRET. Операционной системе приходится выполнить значительно больше работы. Покажем схематичный набросок этой работы в виде набора шагов, которые следует выполнить программному обеспечению после того, как произошло аппаратное прерывание. Необходимо заметить, что детали во многом зависят от конкретной системы, поэтому на каких-то машинах некоторые перечис­ленные шаги могут оказаться лишними, зато может потребоваться выполнение других, не помещенных в список шагов. Кроме того, на разных машинах может потребоваться выполнение перечисленных действий в разном порядке.

1. Сохранить все регистры (включая PSW), не сохраненные аппаратурой.

2. Установить контекст для процедуры обработки прерываний. Выполнение этого действия может включать установку TLB, MMU и таблицы страниц.

3. Установить указатель стека для процедуры обработки прерываний.

4. Выдать подтверждение контроллеру прерываний. Если централизованного контроллера прерываний нет, разрешить прерывания.

5. Скопировать содержимое регистров с того места, где они были сохранены (возможно, в каком-либо стеке), в таблицу процессов.

6. Запустить процедуру обработки прерываний. Она извлечет информацию из регистров контроллера устройства, инициировавшего прерывание.

7. Выбрать процесс, которому передать управление. Если прерывание разбло­кировало какой-либо высокоприоритетный процесс, он может быть выбран в качестве следующего.

8. Установить контекст MMU для следующего работающего процесса. Также может понадобиться определенная установка TLB

9. Загрузить регистры нового процесса, включая его PSW.

10. Начать выполнение нового процесса

PSW – слово состояния процессора

TLB – буфер быстрого преобразования адреса

 

еще рефераты
Еще работы по информатике