Функция | Описание |
---|---|
local_irq_disable | Запретить доставку прерываний на локальном процессоре |
local_irq_enable | Разрешить доставку прерываний на локальном процессоре |
local_irq_save(unsigned long flags) | Сохранить текущее состояние системы обработки прерываний на локальном процессоре и запретить прерывания |
local_irq_restore(unsigned long flags) | Восстановить указанное состояние системы прерываний на локальном процессоре |
disable_irq(unsigned int irq) | Запретить указанную линию прерывания с гарантией, что после возврата из этой функции не выполняется ни один обработчик данной линии |
disable_irq_nosync(unsigned int irq) | Запретить указанную линию прерывания |
enable_irq(unsigned int irq) | Разрешить указанную линию прерываний |
irqs_disabled | Возвратить ненулевое значение, если запрещена доставка прерываний на локальном процессоре, в противном случае возвращается нуль |
in_interrupt | Возвратить ненулевое значение, если выполнение производится в контексте прерывания, и нуль — если в контексте процесса |
in_irq | Возвратить ненулевое значение, если выполнение производится в контексте прерывания, и нуль — в противном случае |
Не нужно прерывать, мы почти закончили!
В этой главе были рассмотрены прерывания, аппаратные ресурсы, которые используются устройствами для подачи асинхронных сигналов процессору. Прерывания используются аппаратным обеспечением, чтобы прервать работу операционной системы.
Большинство современного аппаратного обеспечения использует прерывания, чтобы взаимодействовать с операционной системой. Драйвер устройства, который управляет некоторым оборудованием, должен зарегистрировать обработчик прерывания, чтобы отвечать на эти прерывания и обрабатывать их. Работа, которая выполняется обработчиками прерываний, включает отправку подтверждения устройству о получении прерывания, инициализацию аппаратного устройства, копирование данных из памяти устройства в память системы и, наоборот, обработку аппаратных запросов и отправку ответов на них.
Ядро предоставляет интерфейсы для регистрации и освобождения обработчиков прерываний, запрещения прерываний, маскирования линий прерываний и проверки состояния системы прерываний. В табл. 6.2 приведен обзор некоторых из этих функций.
Так как прерывания прерывают выполнение другого кода (кода процессов, кода ядра и другие обработчики прерываний), то они должны выполняться быстро. Тем не менее часто приходится выполнять много работы. Для достижения компромисса между большим количеством работы и необходимостью быстрого выполнения обработка прерывания делится на две половины. Верхняя половина — собственно обработчик прерывания — рассматривается в этой главе. Теперь давайте рассмотрим нижнюю половину процесса обработки прерывания.
Глава 7
Обработка нижних половин и отложенные действия
В предыдущей главе были рассмотрены обработчики прерываний — механизм ядра, который позволяет решать задачи, связанные с аппаратными прерываниями. Конечно, обработчики прерываний очень полезны и являются необходимой частью ядра. Однако, в связи с некоторыми ограничениями, они представляют собой лишь часть процесса обработки прерываний. Эти ограничения включают следующие моменты.
• Обработчики прерываний выполняются асинхронно и потенциально могут прерывать выполнение другого важного кода (даже другие обработчики прерываний). Поэтому обработчики прерываний должны выполняться как можно быстрее.
• Обработчики прерываний выполняются в лучшем случае при запрещенной обрабатываемой линии прерывания и в худшем случае (когда установлен флаг SA_INTERRUPT
) — при всех запрещенных линиях запросов на прерывания. И снова они должны выполняться как можно быстрее.
• Обработчики прерываний очень критичны ко времени выполнения, так как они имеют дело с аппаратным обеспечением.
• Обработчики прерываний не выполняются в контексте процесса, поэтому они не могут блокироваться.