Linux Kernel (Ядро линукса) (часть 1)


Управляющий

Блок процессора автоматически сбрасывает флаг if в регистре ef lags, потому что обработчик прерывания вызывается с помощью шлюза прерывания, хранящегося в таблице дескрипторов прерываний. Однако мы вскоре увидим, что ядро может снова включить локальные прерывания перед выполнением служебных процедур обработки данного прерывания.

Ситуация намного усложняется при использовании усовершенствованного программируемого контроллера ввода/вывода прерываний. В зависимости от типа прерывания его подтверждение может быть либо произведено с помощью метода аск, либо отложено до завершения обработчика прерываний (то есть подтверждение может быть выполнено методом end). В любом случае мы принимаем как само собой разумеющееся то, что локальный APIC- контроллер не будет воспринимать последующие прерывания этого типа, пока не завершится обработчик прерываний, хотя эти прерывания могут быть приняты другими процессорами.

Затем функция do iRQ инициализирует несколько флагов главного дескриптора прерывания. Она устанавливает флаг irq pending, потому что прерывание было подтверждено (в определенном смысле), но фактически еще не обработано. Кроме того, функция сбрасывает флаги irq waiting и irq replay
Далее функция do iRQ проверяет, действительно ли она должна обработать прерывание.
Существует три случая, в которых ничего не нужно предпринимать:
- Флаг irq disabled установлен — процессор, возможно, вызвал функцию
do iRQ , хотя соответствующая IRQ-линия отключена.

Описание этого
Кроме того, материнские платы с дефектами могут генерировать ложные прерывания, даже если IRQ-линия в программируемом контроллере прерываний отключена.

- Флаг irq inprogress установлен — в многопроцессорной системе другой процессор, возможно, обрабатывает предыдущее возникновение того же прерывания. Почему бы не переложить обработку данного прерывания на тот процессор? Именно так и поступает Linux. Этот подход упрощает архитектуру ядра, потому что служебным процедурам обработки прерываний от драйверов устройств не нужно быть реентерабельными (их выполнение сериализуется). Кроме того, освободившийся процессор может быстро вернуться к своим прежним делам, не загрязняя свой аппаратный кэш, а это способствует повышению производительности системы. Флаг irq inprogress устанавливается, когда процессор собирается выполнить служебные процедуры обработки прерывания, и поэтому функция do iRQ проверяет его до начала реальной работы.

- Поле irq desc [irq]. action содержит null — эта ситуация возникает, когда с прерыванием не ассоциировано никакой служебной процедуры. Обычно это случается, только когда ядро зондирует аппаратное устройство.
Предположим, что ни один из трех случаев не имеет места, и прерывание должно быть обслужено. Функция do iRQ устанавливает флаг
irq inprogress и входит в цикл. На каждом шаге цикла она сбрасывает флаг irq pending, освобождает спин-блокировку прерывания и выполняет служебные процедуры обработки прерывания, для чего вызывает функцию handie iRQ event . Когда последняя возвратит управление, функция do iRQ снова получает спин-блокировку и проверяет состояние флага irq pending. Если он сброшен, значит, последующие сигналы этого прерывания не были доставлены другому процессору, так что цикл завершается. Если же флаг irq pending установлен, значит, другой процессор вызвал функцию do iRQ для этого типа прерывания, пока этот процессор ВЫПОЛНЯЛ фуНКЦИЮ handie iRQ event . Тогда фуНКЦИЯ do iRQ ВЫ- полняет еще один шаг цикла, обслуживая новое возникновение этого прерывания.

Теперь наша функция do iRQ готова завершить свою работу, либо потому что она уже выполнила служебные процедуры обработки прерывания, либо потому что ей ничего не надо было делать. Функция вызывает метод end главного дескриптора прерывания. При работе со старым программируемым КОНТрОЛЛерОМ Прерываний 8259А соответствующая фуНКЦИЯ end_8259A_irq снова включает IRQ-линию (если прерывание не было ложным). При использовании усовершенствованного программируемого контроллера ввода/вывода прерываний метод end подтверждает прерывание (если этого не сделал метод аск).

Наконец, функция do iRQO освобождает спин-блокировку— самая трудная часть работы закончена!

Предыдущая страница | 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 | Следующая страница




Возможно, Вас также заинтересует:

ОС Knoppix - это Linux без про...

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга...

Linux Kernel (Ядро линукса) (ч...

Спин-блокировкаСпин-блокировка необходима в многопроцессорной системе, потому что могут возникнуть...

Linux Kernel (Ядро линукса) (ч...

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно...

Linux Kernel (Ядро линукса) (ч...

Буферы блоков и головы буферовУ каждого буфера есть дескриптор голова буфера, имеющий тип buffer...