Читать «Разработка ядра Linux» онлайн - страница 95
Роберт Лав
Макрос 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() | Возвратить ненулевое значение, если выполнение производится в контексте прерывания, и нуль — в противном случае |
Не нужно прерывать, мы почти закончили!
В этой главе были рассмотрены прерывания, аппаратные ресурсы, которые используются устройствами для подачи асинхронных сигналов процессору. Прерывания используются аппаратным обеспечением, чтобы прервать работу операционной системы.
Большинство современного аппаратного обеспечения использует прерывания, чтобы взаимодействовать с операционной системой. Драйвер устройства, который управляет некоторым оборудованием, должен зарегистрировать обработчик прерывания, чтобы отвечать на эти прерывания и обрабатывать их. Работа, которая выполняется обработчиками прерываний, включает отправку подтверждения устройству о получении прерывания, инициализацию аппаратного устройства, копирование данных из памяти устройства в память системы и, наоборот, обработку аппаратных запросов и отправку ответов на них.