Еще раз о прерываниях

После краткого введения в прерывания в разделе «Устройства ввода-вывода» главы 1 настало время дать о них более подробные сведения. В типичной персональной компьютерной системе присутствует структура прерываний, показанная на рис.
5.4. На аппаратном уровне прерывания работают следующим образом. Когда устройство ввода-вывода завершает порученную ему работу, оно инициирует прерывание (при условии, что прерывания разрешены операционной системой). Это делается путем выставления сигнала на специально выделенной линии шины. Микросхема контроллера прерываний, расположенная на системной плате, обнаруживает этот сигнал и принимает решение о характере дальнейших действий.


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

Для обработки прерывания контроллер помещает номер на адресные линии, указывая, какое устройство требует к себе внимания, и выставляет сигнал на прерывание работы центрального процессора.

Сигнал на прерывание приводит к тому, что центральный процессор прерывает работу над тем, чем он занимался, и приступает к другой работе. Номер на адресных линиях используется в качестве индекса в таблице, называемой вектором прерываний, из
которой извлекается новое значение счетчика команд. Этот счетчик команд указывает на начало соответствующей процедуры обработки прерывания. Как правило, с этого момента системные и обычные прерывания используют один и тот же механизм и довольно часто используют один и тот же вектор прерывания. Местоположение вектора прерываний может быть «зашито» в самой машине или находиться где-нибудь в памяти, в том месте, на которое указывает регистр центрального процессора (загружаемый операционной системой).

Практически сразу после запуска процедура обработки прерывания подтверждает получение прерывания, записывая определенное значение в один из портов ввода-вывода контроллера прерываний. Это подтверждение сообщает контроллеру, что он может выдавать новое прерывание. За счет задержки этого подтверждения центральным процессором до тех пор, пока он не будет готов к обработке нового прерывания, может быть устранена конкуренция, связанная с наличием нескольких (почти одновременно выдаваемых) прерываний.

Между прочим, у некоторых устаревших компьютеров отсутствует централизованный контроллер прерываний, поэтому каждый контроллер устройства выставляет собственные прерывания.

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

Возникает вопрос: где следует хранить эту информацию? Можно поместить ее во внутренние регистры, значение которых операционная система может считывать по мере надобности. Но при этом возникает проблема, не позволяющая дать подтверждение контроллеру прерываний до тех пор, пока не будет считана вся потенциально важная информация, поскольку следующее прерывание при сохранении состояния перепишет все внутренние регистры. Такая стратегия приводит к продолжительным простоям, в течение которых запрещены прерывания, и к возможным потерям сигналов прерываний и потерям данных.

Именно поэтому большинство центральных процессоров сохраняют информацию в стеке. Но этот подход также имеет свои проблемы. Сначала возникает вопрос: в чьем стеке хранить данные? Если использовать текущий стек, то он может быть стеком пользовательского процесса. Указатель стека может даже содержать недопустимое значение, что приведет к фатальной ошибке при попытке оборудования записать несколько слов по адресу, на который он указывает. Он также может указывать на конец страницы. После нескольких записей может произойти выход за ее пределы, и будет сгенерирована ошибка отсутствия страницы. Возникновение этой ошибки во время обработки аппаратного прерывания создает весьма серьезную проблему: где сохранить состояние, чтобы обработать ошибку отсутствия страницы?

При использовании стека ядра возникает намного большая вероятность того, что указатель стека содержит допустимое значение и указывает на фиксированную страницу. Но переключение в режим ядра может потребовать изменения контекста MMU и, вероятно, сделает недействительной большую часть или даже все содержимое кэша и TLB. Их статическая или динамическая перезагрузка увеличит время обработки прерывания и приведет к пустой трате времени центрального процессора.

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

Еще по теме Еще раз о прерываниях:

  1. Повторяю еще раз
  2. Еще раз о духовности
  3. Еще раз о духовности
  4. 3. Еще раз о штампах
  5. Еще раз о З.Фрейде
  6. Еще раз о советском воспитании
  7. Еще раз про любовь
  8. Еще раз про любовь
  9. Еще раз об аспектах Лунных узлов
  10. Дорогой Мастер Крайон, не мог бы ты еще раз пролить Свет на это явление - нейтральный имплант? Что же это такое и для чего его принимать?
  11. СЛУШАЙТЕ, СЛУШАЙТЕ И ЕЩЕ РАЗ СЛУШАЙТЕ
  12. 7.3.2. Прерывания
  13. 7.4.4. Как справиться с прерыванием.
  14. 7.3.2. Прерывания
  15. Прерывание обвинений:
  16. Прерывание нотаций:
  17. Прерывание криков и ругани:
  18. 7.4.4. Как справиться с прерываниями
  19. Раз