Инициализация систем функций в Linux

На этапе инициализации системы функция init iRQO устанавливает поле status у всех главных дескрипторов IRQ-линий в значение irq disabled. Кроме того, функция init iRQ () обновляет таблицу дескрипторов прерываний, заменяя шлюзы прерываний, установленные функцией setup idt () на новые. Это делается с помощью следующих операторов. Этот код просматривает массив interrupt в поисках адресов обработчиков прерываний, которые он использует при установке шлюзов прерываний. Каждый элемент массива interrupt хранит адрес обработчика прерываний по линии IRQ. Обратите внимание, что шлюз прерываний, соответствующий вектору 128, остается нетронутым, потому что он используется для программного исключения, генерируемого системным вызовом ОС Linux.
Кроме чипа 8259А, упомянутого в начале главы, Linux поддерживает несколько других схем программируемых контроллеров прерываний, например, SMP-APIC, внутренний контроллер 8259 для Intel PIIX4 и контроллер SGI Visual Workstation Cobalt (IO) APIC. Чтобы унифицировать работу с такими устройствами, Linux использует PIC-объект, состоящий из имени программируемого контроллера прерываний и семи стандартных методов такого контроллера. Преимущество подобного объектно-ориентированного подхода в том, что драйверам не нужно знать, какой программируемый контроллер прерываний установлен в системе. Каждый источник прерываний, видный драйверу, прозрачно связан с соответствующим контроллером. Структура данных, определяющая PIC-объект, называется hw interrupt type (а также hw_irq_controller).
Ради конкретности изложения предположим, что у нашего компьютера один процессор и два программируемых контроллера прерываний 8259А, обеспечивающих 16 стандартных IRQ — линий. В этом случае поля handier всех шестнадцати дескрипторов irqdesct указывают на переменную типа i 82 59A_i rq_type, описывающую контроллер 8259А. Эта переменная инициализируется следующим образом.
Первое поле этой структуры, «xt-pic», является именем программируемого контроллера прерываний. Далее идут указатели на шесть различных функций, используемых при программировании контроллера. Первые две функции соответственно открывают и закрывают IRQ-линию чипа. Для чипа 8259А они совпадают с третьей и четвертой функциями, которые включают и выключают линию. Функция mask_and_ack_8259A() подтверждает получение IRQ-запроса, посылая соответствующие байты на порты ввода/вывода 8259А. Функция end_8 25 9A_i гq () вызывается, когда обработчик прерывания для IRQ-линии завершает работу. Метод set affinity установлен в null. Он используется в многопроцессорных системах для объявления близости”процессоров к указанным IRQ-линиям, т. е. для определения, какие процессоры должны работать с той или иной IRQ-линией.
Как было сказано ранее, одну IRQ-линию могут использовать несколько устройств. Поэтому ядро поддерживает дескрипторы irqaction, каждый из которых ссылается на конкретное аппаратное устройство и конкретное прерывание.
И наконец, массив irq stat содержит nr cpus элементов, по одному на каждый процессор в системе. Каждый элемент имеет тип irq cpustat t и содержит несколько счетчиков и флагов, используемых ядром для отслеживания того, чем занимаются процессоры в настоящий момент.