Для использования Ethernet карты, необходимы специальные функции, которые расположенные в ядре вашего Linux и знающие как работать с этим устройством. Они называются драйвера устройств. Отсутствие данных драйверов не позволит выйти в Сеть, что очень важно для тех, кто работает в Интернете (создает сайты, ведет блог, занимается серфингом в Глобальной сети и т.д.). Существует три способа выбрать линию для устройства с конфигурируемым IRQ:
- с помощью аппаратных перемычек (только на очень старых картах);
- с помощью утилиты, поставляемой с устройством и выполняемой при его установке. Такая программа либо просит пользователя выбрать доступную IRQ-линию, либо зондирует систему и определяет свободную линию сама;
- с помощью аппаратного протокола, выполняемого при запуске системы. Периферийные устройства объявляют, какие линии они готовы использовать, а окончательные значения являются предметом переговоров, имеющих целью минимизацию конфликтов. Когда эта процедура закончена, каждый обработчик прерываний может считать назначенный номер IRQ с помощью функции, обращающейся к определенным портам ввода/вывода на устройстве. Например, драйверы устройств, удовлетворяющих стандарту PCI (Peripheral Component Interconnect.
Взаимосвязь периферийных компонентов
Используют группу функций, таких как pci_read_ conf ig byte (), для доступа к пространству конфигурации устройства.
Достаточно произвольная схема организации устройств и IRQ-линий на типичном персональном компьютере.
Ядро должно распознать, какое устройство ввода/вывода соответствует каждой IRQ-линии до включения прерываний. В противном случае как оно, например, будет обрабатывать сигнал от SCSI-диска, не зная, какой вектор соответствует этому устройству? Соответствие устанавливается при инициализации драйвера каждого устройства.
Структуры данных для IRQ-линий
Как всегда, при обсуждении сложных операций, включающих в себя переходы из одного состояния в другое, полезно разобраться, где хранятся ключевые данные. Итак, в этом разделе описываются структуры данных, поддерживающие обработку прерываний, а также их расположение в различных дескрипторах. Схематически изображено соотношение между основными дескрипторами, представляющими состояние IRQ-линий. У каждого вектора прерывания есть свой дескриптор irq desc t. Все эти дескрипторы собраны в массив irq desc.
Прерывание называется неожиданным, если оно не обрабатывается ядром, т. е. если либо с IRQ-линией не ассоциирована никакая служебная процедура обработки прерываний, либо ни одна из служебных процедур обработки прерываний, ассоциированных с этой линией, не распознает прерывание как возбужденное ее аппаратным устройством. Обычно ядро проверяет количество неожиданных прерываний, принятых по IRQ-линии, чтобы отключить ее, если неисправное аппаратное устройство снова и снова возбуждает прерывание. Поскольку IRQ-линию могут совместно использовать несколько устройств, ядро не отключает ее сразу после обнаружения одного необработанного прерывания. Вместо этого оно сохраняет в полях irq count и irqs_ unhandied дескриптора irq desc t суммарное количество прерываний и количество неожиданных прерываний соответственно. Когда возникает 100-тысячное прерывание, ядро отключает линию, если количество необработанных прерываний превышает 99 900 (то есть если меньше 101 прерывания из 100 000 принятых оказались ожидаемыми прерываниями от аппаратных устройств, не использующих эту линию).
Поле depth и флаг irq disabled дескриптора irq desc t определяют, включена или отключена IRQ-линия. Всякий раз, когда вызывается функция disable_irq () или disable_irq_nosync (). Значение в поле depth увеличивается. Если depth равно 0, функция отключает IRQ-линию и устанавливает для нее флаг irq disabled. И наоборот, каждый вызов функции enable_irq() уменьшает значение поля. Когда поле depth становится равным 0, функция включает IRQ-линию и сбрасывает флаг irq disabled.