Поэтому таймеры имеют другое назначение, чем механизмы, описанные в данной главе. Более полное обсуждение таймеров ядра будет приведено в главе 10, "Таймеры и управление временем".
Путаница с нижними половинами
Некоторая путаница с обработчиками нижних половин имеет место, но на самом деле — это только проблема названий. Давайте снова вернемся к этому вопросу.
Термин "нижняя половина" ("bottom half") — это общий термин, который касается операционных систем и связан с тем, что некоторая часть процесса обработки прерывания откладывается на будущее. В операционной системе Linux сейчас этот термин означает то же самое. Все механизмы ядра, которые предназначены для отложенной обработки, являются обработчиками нижних половин.
Некоторые люди также называют обработчики нижних половин программными прерываниями иди "softirq", но они просто пытаются досадить остальным.
Термин "Bottom Half" также соответствует названию самого первого механизма выполнения отложенных действий в операционной системе Linux. Этот механизм еще называется "BH", поэтому далее так будем называть именно этот механизм, а термин "нижняя половина" ("bottom half") будет касаться общего названия. Механизм BH был некоторое время назад выключен из употребления и полностью изъят в ядрах серии 2.5.
Сейчас есть три метода для назначения отложенных операций: механизм отложенных прерываний (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
, определенных в файле в следующем виде.
/*
* структура, представляющая одно отложенное прерывание
*/
struct softirq_action {
void (*action)(struct softirq_action*);
/* функция, которая должна выполниться */
void *data; /* данные для передачи в функцию */
};
Массив из 32 экземпляров этой структуры определен в файле kernel/softirq.с
в следующем виде.
static struct softirq_action softirq_vec[32];
Каждое зарегистрированное отложенное прерывание соответствует одному элементу этого массива. Следовательно, имеется возможность создать 32 обработчика softirq. Заметим, что это количество фиксировано. Максимальное число обработчиков softirq не может быть динамически изменено. В текущей версии ядра из 32 элементов используется только шесть [37] Большинство драйверов использует для обработки своих нижних половин механизм тасклетов. Тасклеты построены на механизме softirq, как это будет показано ниже.
.
Обработчик softirq
Прототип обработчика отложенного прерывания, поля action
, выглядит следующим образом.
void softirq_handler(struct softirg_action*);
Когда ядро выполняет обработчик отложенного прерывания, то функция action
вызывается С указателем на соответствующую структуру softirq_action
в качестве аргумента. Например, если переменная my_softirq
содержит указатель на элемент массива softirq_vec
, то ядро вызовет функцию-обработчик соответствующего отложенного прерывания в следующем виде.
my_softirq->action(my_softirq);
Может быть, несколько удивляет, что ядро передает в обработчик указатель на всю структуру, а не только на поле data. Этот прием позволяет в будущем вводить дополнительные поля в структуру без необходимости внесения изменений в существующие обработчики. Обработчик может получить доступ к значению ноля data
простым разыменованием указателя на структуру и чтением ее поля data
.
Читать дальше