Состояние системы обработки прерываний
Состояние системы обработки прерываний
Часто необходимо знать состояние системы обработки прерываний (например, прерывания запрещены или разрешены, выполняется ли текущий код в контексте прерывания или в контексте процесса).
Макрос irq_disabled(), который определен в файле <asm/system.h>, возвращает ненулевое значение, если обработка прерываний на локальном процессоре запрещена. В противном случае возвращается нуль. Два следующих макроса позволяют определить контекст, в котором в данный момент выполняется ядро.
in_interrupt()
in_irq()
Наиболее полезный из них — это первый макрос. Он возвращает ненулевое значение, если ядро выполняется в контексте прерывания. Это включает выполнение как обработчика прерывания, так и обработчика нижней половины. Макрос in_irq() возвращает ненулевое значение, только если ядро выполняет обработчик прерывания.
Наиболее часто необходимо проверять, выполняется ли код в контексте процесса, т.е. необходимо проверить, что код выполняется не в контексте прерывания. Это требуется достаточно часто, когда коду необходимо выполнять что-то, что может быть выполнено только из контекста процесса, например переход в приостановленное состояние. Если макрос in_interrupt() возвращает нулевое значение, то ядро выполняется в контексте процесса.
Таблица 6.2. Список функций управления прерываниями
Функция Описание 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() Возвратить ненулевое значение, если выполнение производится в контексте прерывания, и нуль — в противном случае