Книга: Разработка ядра Linux
Состояние системы обработки прерываний
Состояние системы обработки прерываний
Часто необходимо знать состояние системы обработки прерываний (например, прерывания запрещены или разрешены, выполняется ли текущий код в контексте прерывания или в контексте процесса).
Макрос 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() |
Возвратить ненулевое значение, если выполнение производится в контексте прерывания, и нуль — в противном случае |
- Обработчики прерываний
- Глава 6 Прерывания и обработка прерываний
- Реализация системы обработки прерываний
- Запрещение и разрешение прерываний
- Особенности системы защиты данных в InterBase
- 5.4 Команда trap: обработка прерываний
- 1.2. Понятие информации. Общая характеристика процессов сбора, передачи, обработки и накопления информации
- Установка системы на уже подготовленный жесткий диск
- 1.3. Системы счисления
- 7.4. Модель системы автоматизированного проектирования защиты информации
- 1. Системы управления базами данных
- 4. Полнота системы правил Армстронга