Главная » Ядро Linux » Прерывания и обработка прерываний

0

правление аппаратными устройствами, которые подключены к вычислительной  машине, — это одна из самых ответственных функций ядра.  Частью  этой работы является необходимость взаимодействия с отдельными устройствами машины. Поскольку процессоры обычно  работают  во много  раз быстрее, чем аппаратура, с которой они должны  взаимодействовать, то для ядра  получается неэффективным отправлять запросы и тратить  время, ожидая  ответы  от потенциально более  медленного оборудования. Учитывая небольшую скорость отклика оборудования, ядро должно  иметь  возможность оставлять на  время  работу  с оборудованием и выполнять  другие  действия, пока  аппаратное устройство не закончит обработку  запроса. Одно  из возможных решений этой  проблемы — периодический опрос оборудования (polling).  Ядро  периодически может  проверять состояние аппаратного устройства системы и соответственным образом реагировать. Однако такой  подход  вносит  дополнительные накладные расходы, потому  что, независимо от того, готов  ответ  от аппаратного устройства или  оно  еще выполняет запрос, все равно  осуществляется постоянный систематический опрос  состояния устройства через постоянные интервалы времени. Лучшим  решением является обеспечение механизма, который позволяет  подавать  ядру сигнал  о необходимости уделить  внимание оборудованию. Такой

механизм называется прерыванием (interrupt).

Прерывания

Прерывания  позволяют аппаратным устройствам взаимодействовать с процессором.  Например, при  наборе  на клавиатуре контроллер клавиатуры (или  другое устройство, которое  обслуживает клавиатуру) генерирует прерывание,  чтобы  объявить операционной системе  о том, что произошли нажатия клавиш. Прерывания — это специальные электрические сигналы, которые аппаратные устройства посылают процессору. Процессор получает  прерывание и дает сигнал  операционной системе о том, что ОС может  обработать новые  данные. Аппаратные устройства генерируют прерывания асинхронно по отношению к тактовому  генератору процессора — прерывания могут возникать непредсказуемо, в любой  момент  времени. Следовательно, работа  ядра  может  быть прервана в любой  момент  для того, чтобы  обработать прерывания.

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

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

Идентификаторы,  соответствующие прерываниям, часто  называются линиями запросов на прерывание (interrupt request  lines,  IRQ  lines).  Обычно  это некоторые числа. Например, для платформы PC значение IRQ,  равное 0, — это прерывание таймера,  a IRQ,  равное  1, — прерывание клавиатуры. Однако  не все номера  прерываний жестко  определены. Прерывания, связанные с устройствами шины  PCI,  например, назначаются динамически. Другие  платформы, которые  не  поддерживают стандарт PCI,  имеют  аналогичные функции динамического назначения номеров прерываний. Основная идея  состоит  в том,  что определенные прерывания связаны с определенными  устройствами, и у ядра  есть вся  эта  информация. Аппаратное обеспечение, чтобы привлечь внимание ядра,  генерирует  прерывание вроде "Эй! Было новое нажатие   клавиши! Его   необходимо  обработать!.

Исключительные ситуации

Исключительные ситуации (exceptions) часто рассматриваются вместе с прерываниями. В отличие от прерываний, они возникают синхронно с тактовым генератором процессора. И действительно,ихчастоназываютсинхроннымипрерываниями.Исключительныеситуациигенерируются процессором при выполнении машинных инструкций как реакция на ошибку программы (например, деление на нуль) или как реакция на аварийную ситуацию, которая может быть обработана ядром (например, прерывание из-за отсутствия страницы, page fault). Так как большинство аппаратных платформ обрабатывают исключительные ситуации аналогично обработке прерываний, то инфраструктуры ядра, для обоих видов обработки, также аналогичны. Большая частьматериала,посвященнаяобработкепрерываний(асинхронных,которыегенерируютсяаппаратными устройствами), также относится и к исключительным ситуациям (синхронным, которые генерируются самим процессором).

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

Источник: Лав,  Роберт. Разработка ядра  Linux, 2-е  издание. : Пер.  с англ.  — М.  : ООО  «И.Д.  Вильяме» 2006. — 448 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии