В каком контексте находятся softirq и tasklet?
Я знаю, что есть контекст процесса и контекст прерывания, но я не понимаю при выполнении softirq или tasklet, в каком контексте он выполняется.
Я видел, как некоторые люди используют термин "контекст нижних половин", если есть такой термин, какая разница по сравнению с другими.
Еще один вопрос для softirq и tasklet заключается в том, почему сон не разрешен во время выполнения?
Может кто-нибудь помочь мне определить эти вопросы, спасибо!
Ответы
Ответ 1
Softirq и tasklet - оба типа механизма нижней половины. Сон не разрешен, потому что они работают в контексте прерывания, а не в контексте процесса. Если сон разрешен, то Linux не может планировать их и, наконец, вызвать панику ядра с ошибкой dequeue_task. Контекст прерывания даже не имеет структуры данных, описывающей информацию о регистре, поэтому они никогда не могут быть запланированы с помощью linux. Если он предназначен для создания такой структуры и может быть запланирован, будет выполняться производительность процесса обработки прерываний.
Ответ 2
@kai: ваш qs reg, контекст нижнего уровня которого выполняется в?
Технически, softirq запускается в контексте прерывания - контекст "softirq"; это просто не контекст "жесткого irq" (который является контекстом, когда происходит аппаратное прерывание).
Итак, в обработчике softirq с точки зрения макросов "lookup" Linux предоставляет:
in_interrupt: yes | in_irq: no | in_softirq: yes | in_serving_softirq: yes
Но будьте осторожны (остерегайтесь!!!:):
"все ограничения, которые применяются к обработчикам прерываний, также применяются к нижним половинам. Таким образом, нижние половины не могут спать, не могут получить доступ к пользовательскому пространству и не могут вызвать планировщик". - LDD3.
Джермейн отвечает на оставшуюся часть вашего вопроса.
[Обновление]
Кроме того, я хотел бы отметить, что можно определить простые и элегантные макросы, которые помогают распечатывать информацию об отладке по мере необходимости. На протяжении многих лет я помещал эти макросы и удобные процедуры в заголовочный файл; вы можете проверить его и скачать его здесь: "Заголовок удобства" .
Есть макросы/функции для:
- сделать отладочные отпечатки вместе с именем funcname/line # (через обычный
printk() или trace_printk()), и только если режим DEBUG включен
- сбросить стек режима ядра
- распечатать текущий контекст (обрабатывать или прерывать вместе с флагами в форме ftrace)
- простой макрос assert() (!)
- интенсивный CPU DELAY_LOOP (полезен для тестовых установок, которые должны вращаться на процессоре).
- эквивалент функции usermode sleep
- функция для вычисления временной дельта, заданной двумя временными метками (структуры времени)
- преобразовать десятичную в двоичную и
- еще несколько.
Whew: -)
Ответ 3
Я согласен с принятым ответом и ответом Кайвана, но они не упомянули ksoftirqd. Если процессор находится под большой нагрузкой на softirqs и/или tasklets, он планирует поток ksfotirqd, который обрабатывает повышенные softirqs и tasklets в контексте процесса.
Итак, я думаю, что ответ на вопрос OP был бы: softirqs может работать в контексте прерывания или процесса.