Обработчики прерываний

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

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

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

Кроме того, реальные шаги на некоторых машинах могут следовать в ином порядке.

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

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

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

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

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

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

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

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

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

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

Из всего этого можно понять, что обработка прерываний — весьма непростой процесс. К тому же она состоит из существенного количества команд центрального процессора, особенно на машинах с виртуальной памятью, которым необходимы установка страничных таблиц или сохранение состояния MMU (например, битов R и M). На некоторых машинах при переключениях между пользовательским режимом и режимом ядра необходимо также управлять TLB и кэшем центрального процессора, для чего также нужны дополнительные машинные циклы.

5.3.2.

<< | >>
Источник: Э. ТАНЕНБАУМ Х. БОС. СОВРЕМЕННЫЕ ОПЕРАЦИОННЫЕ СИСТЕМ Ы 4-е ИЗДАНИЕ. 2015

Еще по теме Обработчики прерываний:

  1. 7.3.2. Прерывания
  2. 7.4.4. Как справиться с прерыванием.
  3. 7.3.2. Прерывания
  4. Прерывание нотаций:
  5. Прерывание обвинений:
  6. Прерывание криков и ругани:
  7. 7.4.4. Как справиться с прерываниями
  8. Статья 281. Право на жизнь
  9. ПРЕПЯТСТВИЕ ВНЕШНЕЕ
  10. Статья 121. Умышленное тяжкое телесное повреждение
  11. М.Руссинович, Д.Соломон. Внутреннее устройство Microsoft Windows (главы 1–4), 2005
  12. Конфронтация.
  13. Термоядерная реакция при комнатной температуре
  14. Переживание смерти и воскресения
  15. Конфронтация
  16. Рекламные включения в телепрограмму
  17. Овладение мыслью
  18. 2. Информация и ее виды.