Роль флага irq replay
состоит в том, чтобы обеспечить генерирование ровно одного автопрерывания. Вспомним, что функция do iRQ сбрасывает этот флаг, когда приступает к обработке прерывания.
Служебные процедуры обработки прерываний
Как было сказано ранее, служебная процедура обрабатывает прерывание, выполняя некоторую операцию, специфичную для устройства какого-то одного типа. Когда обработчику прерываний приходится выполнять служебные процедуры, он вызывает функцию handie iRQ event . Эта функция выполняет следующие действия:
1. Включает локальные прерывания ассемблерной инструкцией sti, если флаг sa_interrupt сброшен.
2. Выполняет служебную процедуру обработки данного прерывания при помощи такого кода:
retval = 0; do {
retval |= action->handler(irq, action->dev_id, regs); action = action->next;
} while (action);
В начале цикла переменная action указывает на начало списка структур irqaction, определяющих действия, предпринимаемые после получения прерывания
3. Отключает локальные прерывания ассемблерной инструкцией cii.
4. Завершает работу, возвращая значение локальной переменной retval, т. е.0,если ни одна служебная процедура не распознала прерывание, и 1 в противном случае.
Все служебные процедуры обработки прерываний принимают одинаковый набор параметров (повторимся, они передаются через регистры еах, edx и есх соответственно):
- irq — номер прерывания;
- dev id — идентификатор устройства;
- regs — указатель на структуру pt regs, хранящуюся в стеке (исключений) режима ядра и содержащую регистры, сохраненные сразу после возникновения прерывания.
Структура pt regs состоит из 15 полей:
• первые девять полей содержат значения регистров, сохраненные макросом save_all;
• десятое поле, на которое ссылается поле по имени orig eax, содержит номер прерывания;
• остальные поля соответствуют значениям регистров, которые были автоматически сохранены управляющим блоком.
Первый параметр позволяет одной служебной процедуре работать с несколькими IRQ-линиями, второй позволяет одной служебной процедуре обслуживать несколько устройств одного типа, а третий предоставляет служебной процедуре доступ к контексту выполнения прерванного управляющего тракта ядра. На практике большинство служебных процедур обработки прерываний не пользуется этими параметрами.
Каждая служебная процедура обработки прерывания возвращает 1, если прерывание было эффективно обработано, т. е. если сигнал был послан аппаратным устройством, за обслуживание которого отвечает данная процедура (а не другим устройством, использующим ту же IRQ-линию). В противном случае служебная процедура возвращает 0. Этот код возврата позволяет ядру обновить счетчик неожиданных прерываний, упомянутый в разд.
Предыдущая страница | 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 | Следующая страница