Читать «Разработка ядра Linux» онлайн - страница 101
Роберт Лав
Сейчас есть три метода для назначения отложенных операций: механизм отложенных прерываний (softirq), механизм тасклетов и механизм очередей отложенных действий. Тасклеты построены на основе механизма softirq, а очереди отложенных действий имеют полностью отличную реализацию. В табл. 7.1 показана история обработчиков нижних половин.
Таблица 7.1. Состояние обработчиков нижних половин
Механизм обработчиков | Состояние |
---|---|
BH | Изъято в серии 2.5 |
Очереди заданий | Изъято в серии 2.5 |
Отложенные прерывания | Доступно начиная с серии 2.3 |
Тасклеты | Доступно начиная с серии 2.3 |
Очереди отложенных действий | Доступно начиная с серии 2.3 |
Давайте продолжим рассмотрение каждого из механизмов в отдельности, пользуясь этой устойчивой путаницей в названиях.
Механизм отложенных прерываний (softirq)
Обсуждение существующих методов обработки нижних половин начнем с механизма softirq. Обработчики на основе механизма отложенных прерываний используются редко. Тасклеты — это более часто используемая форма обработчика нижних половин. Поскольку тасклеты построены на основе механизма softirq, с механизма softirq и стоит начать. Код, который касается обработчиков отложенных прерываний, описан в файле kernel/softirq.c
.
Реализация отложенных прерываний
Отложенные прерывания определяются статически во время компиляции. В отличие от тасклетов, нельзя динамически создать или освободить отложенное прерывание. Отложенные прерывания представлены с помощью структур softirq_action
, определенных в файле <linux/interrupt.h>
в следующем виде.
/*
* структура, представляющая одно отложенное прерывание
*/
struct softirq_action {
void (*action)(struct softirq_action*);
/* функция, которая должна выполниться */
void *data; /* данные для передачи в функцию */
};
Массив из 32 экземпляров этой структуры определен в файле kernel/softirq.с
в следующем виде.
static struct softirq_action softirq_vec[32];
Каждое зарегистрированное отложенное прерывание соответствует одному элементу этого массива. Следовательно, имеется возможность создать 32 обработчика softirq. Заметим, что это количество фиксировано. Максимальное число обработчиков softirq не может быть динамически изменено. В текущей версии ядра из 32 элементов используется только шесть.
Обработчик softirq
Прототип обработчика отложенного прерывания, поля action
, выглядит следующим образом.
void softirq_handler(struct softirg_action*);
Когда ядро выполняет обработчик отложенного прерывания, то функция action
вызывается С указателем на соответствующую структуру softirq_action
в качестве аргумента. Например, если переменная my_softirq
содержит указатель на элемент массива softirq_vec
, то ядро вызовет функцию-обработчик соответствующего отложенного прерывания в следующем виде.