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


Работа с softirq-функциями

Функция open softirqO отвечает за инициализацию softirq-функции. Она принимает три параметра: индекс softirq-функции, указатель на softirq- функцию, которая должна быть выполнена, и второй указатель на структуру данных, которая может понадобиться softirq-функции. Функция ореп_ softirq ограничивается инициализацией соответствующего элемента массива softirq_vec.
Softirq-функции активизируются функцией raise softirq о . Она принимает в качестве параметра индекс softirq-функции nr и выполняет следующие действия:
1. Выполняет макрос locai irq save, чтобы сохранить состояние флага if регистра ef lags и отключить прерывания на локальном процессоре.
2. Помечает softirq-функцию как висящую, для чего устанавливает бит, соответствующий индексу nr, в битовой маске softirq-функций локального процессора.
3. Если функция in interrupt возвращает. Эта ситуация означает, что либо функция raise softirqO была вызвана в контексте прерывания, либо softirq-функции в настоящий момент запрещены.
4. В противном случае описываемая функция вызывает функцию wakeup softirqdo, чтобы в случае необходимости разбудить поток ядра ksoftirqd локального процессора.
5. Выполняет макрос locai irq restore, чтобы восстановить состояние флага if, сохраненное на шаге.
Проверки наличия активных (висящих) softirq-функций должны проводиться регулярно, но так, чтобы не слишком увеличивать накладные расходы. Это делается в нескольких точках кода ядра.


Приведем список наиболее важных таких точек (мы должны оговориться, что количество и позиции точек проверки softirq-функций меняются от версии к версии ядра и в зависимости от архитектуры):

- когда ядро вызывает функцию iocai_bh_enabie 15, чтобы разрешить softirq-функции на локальном процессоре;
- когда функция do iRQ заканчивает обработку прерывания ввода/вывода И вызывает функцию irq_exit ;
-при наличии контроллера I/O APIC когда функция smp_apic_timer_interrupt о заканчивает обработку прерывания по локальному таймеру
-в многопроцессорных системах — когда процессор заканчивает обработку функции, вызванной межпроцессорным прерыванием call_function_ vector;
-когда разбужен один из специальных потоков ядра ksoftirqd/n.
Функция dojsoftirqi)
Если на одной из перечисленных контрольных точек распознаны висящие softirq-функции (значение макроса locai softirq pendingO не равно 0), ядро вызывает функцию do softirqO для работы с ними.

Эта функция выполняет следующие действия:

1. Если функция in interrupt возвращает , описываемая функция завершает работу. Эта ситуация означает, либо что функция do softirqO была вызвана в контексте прерывания, либо что softirq-функции в настоящий момент запрещены.
2. Выполняет макрос locai irq save, чтобы сохранить состояние флага if и отключить прерывания на локальном процессоре.
3. Если размер структуры thread union равен 4 Кбайт, функция переключается на стек мягких IRQ-запросов в случае необходимости. Этот шаг очень
похож на шаг функции do iRQ , описанной ранее в этой главе. Конечно, вместо массива hardirq_ctx используется массив softirq_ctx.
4. Вызывает функцию dosoftirq
5. Если на шаге фактически произошло переключение на стек гибких IRQ- запросов, функция восстанавливает первоначальный указатель стека в регистре esp, тем самым переключаясь на стек исключений, который был в работе до этого.
6. Выполняет макрос locai irq restore, чтобы восстановить состояние IF (локальные прерывания включены или отключены), сохраненное на шаге , а затем возвращает управление.

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