Состояние системы обработки прерываний

Состояние системы обработки прерываний

Часто необходимо знать состояние системы обработки прерываний (например, прерывания запрещены или разрешены, выполняется ли текущий код в контексте прерывания или в контексте процесса).

Макрос 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() Возвратить ненулевое значение, если выполнение производится в контексте прерывания, и нуль — в противном случае
Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

9.2.3.2 Обработка прерываний по отказу системы защиты

Из книги Архитектура операционной системы UNIX автора Бах Морис Дж

9.2.3.2 Обработка прерываний по отказу системы защиты Вторым типом отказа, встречающегося при обращении к странице, является отказ системы защиты, который означает, что процесс обратился к существующей странице памяти, но судя по разрядам, описывающим права доступа к


10.1.3 Программы обработки прерываний

Из книги Энциклопедия разработчика модулей ядра Linux автора Померанц Ори

10.1.3 Программы обработки прерываний Как уже говорилось выше (раздел 6.4.1), возникновение прерывания побуждает ядро запускать программу обработки прерываний, в основе алгоритма которой лежит соотношение между устройством, вызвавшим прерывание, и смещением в таблице


Обработчики прерываний

Из книги Тайм-менеджмент для системных администраторов автора Лимончелли Томас

Обработчики прерываний Везде, кроме последней главы, все, что мы пока делали в ядре, сводилось к запросам и ответам разным процессам или работали со специальными файлом, посылали ioctl или выдавали системный вызов. Но работа ядра не должна сводится только к обработке


Перенаправление прерываний

Из книги Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform автора Кёртен Роб

Перенаправление прерываний Начнем с попытки устранить самое неприятное из возможных прерываний: к вам обращаются с проблемой, которую должен решить кто-то другой. Может быть, поступим так:— Том, проблема с веб-сервером.— Отлично! Сообщи мне о результатах, когда


Источники прерываний таймера

Из книги Операционная система UNIX автора Робачевский Андрей М.

Источники прерываний таймера На этом мы, пожалуй, закончим наш краткий экскурс по стране таймеров и перейдем к вещам, которые уже не так очевидны.Откуда возникают прерывания таймера? На рисунке ниже приведены аппаратные компоненты (и некоторые характерные для PC значения


Написание обработчиков прерываний

Из книги Разработка ядра Linux автора Лав Роберт

Написание обработчиков прерываний Давайте посмотрим, как настроить обработчики прерываний — вызовы, характеристики и кое-какие стратегии


Подключение обработчиков прерываний

Из книги автора

Подключение обработчиков прерываний Для подключения к источнику прерывания воспользуйтесь функцией InterruptAttach() или InterruptAttachEvent().#include <sys/neutrino.h>int InterruptAttachEvent(int intr, const struct sigevent *event, unsigned flags);int InterruptAttach(int intr, const struct sigevent* (*handler)(void *area, int id), const void *area, int size, unsigned flags);Параметр


Обработчики прерываний

Из книги автора

Обработчики прерываний Обработчики прерываний в QNX4 могли либо возвратить идентификатор прокси (указывая этим, что надо переключить прокси и таким образом уведомить ее владельца о прерывании), либо возвратить нуль (что означало бы, что в дальнейшем ничего делать не


Обработка прерываний таймера

Из книги автора

Обработка прерываний таймера Каждый компьютер имеет аппаратный таймер или системные часы, которые генерируют аппаратное прерывание через фиксированные интервалы времени. Временной интервал между соседними прерываниями называется тиком процессора или просто тиком (CPU


Обработчики прерываний

Из книги автора

Обработчики прерываний Функция, которую выполняет ядро в ответ на определенное прерывание, называется обработчиком прерывания (interrupt handler) или подпрограммой обслуживания прерывания (interrupt service routine). Каждому устройству, которое генерирует прерывания, соответствует свой


Реализация системы обработки прерываний

Из книги автора

Реализация системы обработки прерываний Возможно, не вызовет удивления, что реализация системы обработки прерываний в операционной системе Linux очень сильно зависит от аппаратной платформы. Она зависит от типа процессора, типа контроллера прерываний, особенностей


Запрещение и разрешение прерываний

Из книги автора

Запрещение и разрешение прерываний Для локального запрещения прерываний на текущем процессоре (и только на текущем процессоре) и последующего разрешения можно использовать следующий код.local_irq_disable();/* прерывания запрещены ... */local_irq_enable();Эти функции обычно реализуются в


Механизм отложенных прерываний (softirq)

Из книги автора

Механизм отложенных прерываний (softirq) Обсуждение существующих методов обработки нижних половин начнем с механизма softirq. Обработчики на основе механизма отложенных прерываний используются редко. Тасклеты — это более часто используемая форма обработчика нижних половин.


Реализация отложенных прерываний

Из книги автора

Реализация отложенных прерываний Отложенные прерывания определяются статически во время компиляции. В отличие от тасклетов, нельзя динамически создать или освободить отложенное прерывание. Отложенные прерывания представлены с помощью структур softirq_action, определенных


Использование отложенных прерываний

Из книги автора

Использование отложенных прерываний Отложенные прерывания зарезервированы для наиболее важных и критичных ко времени выполнения обработчиков нижних половин в системе. Сейчас только две подсистемы — подсистема SCSI и сетевая подсистема — напрямую используют механизм


Обработчик прерываний таймера

Из книги автора

Обработчик прерываний таймера Теперь, когда мы разобрались, что такое jiffies и HZ, а также какова роль системного таймера, рассмотрим реализацию обработчика прерываний системного таймера. Обработчик прерываний таймера разбит на две части: часть, зависимую от аппаратной