Рассмотрим на простом примере, как работает эта схема
Предположим, что некая программа пытается обратиться к файлу устройства /dev/fdO, который соответствует первому накопителю на гибких дисках в системе. Программа может сделать это либо обратившись к файлу /dev/fdO непосредственно, либо
смонтировав на нем файловую систему. Контроллерам гибких дисков обычно назначена линия IRQ .
При таких исходных условиях драйвер может выдать следующий запрос:
request_irq(б, floppy_interrupt,
SA_INTERRUPT|SA_SAMPLE_RANDOM, "floppy", NULL);
Нетрудно заметить, что служебная процедура floppy interrupt должна работать при отключенных прерываниях (флаг sa interrupt установлен), и совместное использование IRQ-линии не допускается (флаг sa shirq отсутствует). Установленный флаг sa sample random говорит о том, что обращения к гибкому диску являются хорошим источником случайных событий, который может быть использован генератором случайных чисел ядра. Когда операция с гибким диском закончится (либо закончится ввод/вывод в файл /dev/fdO, либо файловая система будет размонтирована), драйвер освобождает линию IRQ :
free_irq( NULL);
Чтобы занести дескриптор irqaction в нужный список, ядро вызывает функцию setup irqo, передавая ей в качестве параметров номер прерывания irq nr и адрес new (адрес предварительно выделенного дескриптора irqaction).
Эта функция выполняет следующие действия:
1. Проверяет, использует ли другое устройство IRQ-линию с номером irq nr,
и, если это так, может ли эта линия быть совместно использована (о чем говорят флаги sa shirq в дескрипторах irqaction обоих устройств). Возвращает код ошибки, если совместное использование IRQ-линии невозможно.
2. Добавляет new (новый дескриптор irqaction, на который указывает параметр new) в конец списка, на который указывает переменная
irq_desc[irq_nr]->action.
3. Если никакое другое устройство не использует ту же IRQ-линию, функция сбрасывает флаги irq_disabled, irq_autodetect, irq_waiting и irq inprogress в поле flags дескриптора new и вызывает метод startup PIC-объекта irq_desc[irq_nr]->handier, чтобы IRQ-сигналы были наверняка включены.
Рассмотрим пример использования функции setup irqo на этапе инициализации системы.
Ядро инициализирует дескриптор irqO таймера интервалов, выполняя следующие инструкции в функции time init struct irqaction irqO =
{timer_interrupt, SA_INTERRUPT, 0, "timer", NULL, NULL}; setup_irq(0, &irq0);
Вначале инициализируется переменная irqo, имеющая тип irqaction: в поле handier записывается адрес функции timer interrupt , в поле flags заносится значение флага sa interrupt, в поле паше — имя "timer", а пятое поле устанавливается в null, т. к. значение dev id не используется. Затем ядро вызывает функцию setupirqo, Чтобы ВСТаВИТЬ irqO В СПИСОК ДеСКрИПТОрОВ irqaction, ассоциированных с линией IRQ .
Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | Следующая страница