[Перепечатано] Почему перерыв не может спать

  1. Во время обработки прерываний переключение процессов не должно происходить, потому что в контексте прерываний единственное, что может прервать текущий обработчик прерываний, - это прерывания с более высоким приоритетом, которые не будут прерываться процессом (это то же самое для softirq и tasklet Следовательно, эта нижняя половина не может спать.) Если вы спите в контексте прерывания, нет способа разбудить его, потому что все wake_up_xxx предназначены для определенного процесса, а в контексте прерывания нет понятия процесса, нет task_struct (Это то же самое для softirq и tasklet), поэтому он действительно спит, например, вызывая подпрограмму, которая вызовет блок, ядро ​​почти наверняка умрет.

2. Schedule () сохраняет текущий контекст процесса (значение регистра процессора, состояние процесса и содержимое стека) при переключении процессов, чтобы этот процесс можно было возобновить позже. После возникновения прерывания ядро ​​сначала сохраняет текущий прерванный контекст процесса (восстановленный после вызова обработчика прерываний), но в обработчике прерываний значение регистра ЦП должно было измениться (самый важный программный счетчик ПК, стек SP). И т. Д.) Если schedule () вызывается в это время из-за спящих или блокирующих операций, то сохраненный контекст процесса не является текущим контекстом процесса, поэтому невозможно вызвать schedule () в обработчике прерываний.

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

4. Когда контекст прерывается, ядро ​​не выгружается, поэтому, если оно спит, ядро ​​должно зависнуть.

Если прерывание может спать, это вызовет много проблем. Например, если вы спите в прерывании часов, часы операционной системы будут хаотичными, и планировщик потеряет свою базу, например, вы будете прерваны в IPI (межпроцессорном). ), Другие процессоры ждут вашего ответа в бесконечном цикле, вы спите, затем другие процессоры не работают, например, вы спите в прерывании DMA, вышеописанный процесс все еще синхронно ожидает ввода-вывода После завершения производительность значительно снижается ... Есть много примеров. Поэтому прерывание является неотложным вопросом, который должен быть немедленно решен операционной системой не потому, что он не может спать, а потому, что у него нет причины спать.

Трансфер из: Почему прерывание не может спать

Опубликовано 91 оригинальных статей · Оценено 17 · 50000+ просмотров

рекомендация

отblog.csdn.net/qq_23327993/article/details/105387782
рекомендация