netlib.narod.ru | < Назад | Оглавление | Далее > |
Как это было сделано с сигналами, рассмотрение будет начато с обзора важных структур данных прерываний и нижних половин. На рис. 6.1 показаны взаимосвязи между некоторыми из этих типов данных.
Рис. 6.1. Стркутуры данных, связанные с прерываниями
Начнем с того, что независящий от архитектуры файл заголовка linux/interrupt.h определяет структуру struct irqaction (строка 14844), которая представляет действие, которое ядро должно предпринять при получении определенного IRQ (способ связи структур struct irqaction с IRQ будет показан далее в этой главе). Эта структура имеет следующие члены:
dev_id — уникальный идентификатор типа устройства — каждая модель каждого аппаратного устройства, поддерживаемая Linux, имеет идентификатор устройства, присвоенный изготовителем и записанный в этом члене. Возможные значения получаются из огромного набора, который не приводится в книге, поскольку его включение было бы обременительным и излишним — он представляет собой всего лишь огромные блоки определений #define, которые выглядят подобно следующим:
#define PCI_DEVICE_ID_S3_868 0x8880 #define PCI_DEVICE_ID_S3_928 0x88b0 #define PCI_DEVICE_ID_S3_864_1 0x88c0 #define PCI_DEVICE_ID_S3_864_2 0x88cl
Просмотрев несколько из них, читатель получит представление о всех. Этот фрагмент был выбран, как читатели вероятно догадались, из раздела файла, содержащего идентификаторы устройств для РСI-видеоплат на основе чипов S3.
Хотя dev_id является указателем, он ни на что не указывает и попытка раскрыть его была бы ошибкой. Значение имеет только его разрядный шаблон.
Следующие две представляющие интерес структуры данных находятся в архитектурно-зависимом файле arch/i386/kernel/irq.h. Первая структура struct hw_interrupt_type (строка 1673) аннотирует контроллер прерываний. В основном, она представляет собой набор указателей на функции, которые выполняют характерные для контроллера операции:
Вторая, представляющая интерес структура данных этого файла, irq_desc_t (строка 1698), имеет следующие члены:
Структуры irq_desc_t организуются в массив irq_desc (строка 733). Для каждого IRQ существует одна запись массива, и таким образом массив сопоставляет номер каждого IRQ соответствующему обработчику и другой информации в структуре irq_desc_t.
Последний заслуживающий упоминания набор структур данных начинается в строке 29094; эти структуры связанны с нижними половинами:
bh_mask и bh_active (строки 14856 и A HREF="part1_39.htm#l14857">14857) — вместе эти члены управляют тем, будет ли выполнена нижняя половина. Каждый из них имеет 32 разряда, по одному разряду на нижнюю половину. Когда верхняя половина (или какая-либо другая часть кода) решает, что его нижняя половина должна быть выполнена, она помечает ее, устанавливая разряд в bh_active (используя mark_bh, строка 12498). Независимо от того, была ли она помечена таким образом, нижняя половина может быть полностью отключена посредством очистки соответствующего разряда в bh_mask — enable_bh и disable_bh делают это, одновременно настраивая запись bh_mask_count.
Следовательно, поразрядное AND членов bh_mask и bh_active определяет, какие нижние половины должны быть выполнены. В частности, если результатом поразрядаого AND является 0, никакие нижние половины не должны быть выполнены. Эта технология используется в ядре неоднократно, как, например, в макросе get_active_bhs (строка 12480).
Неименованная структура enum — неименованная структура enum, начинающаяся в строке 14866, связывает символическое имя с каждой из используемых ядром нижних половин. Например, чтобы пометить в качестве активной нижнюю половину таймера, нужно было бы написать:
mark_bh (TIMER_BH);
Строка 27450 именно это и делает.
netlib.narod.ru | < Назад | Оглавление | Далее > |