Позвольте мне объяснить некоторые основные свойства обработчика прерываний или нижней половины.
- Обработчик не может передавать данные в пользовательское пространство или из него, поскольку он не выполняется в контексте процесса.
- Обработчики также не могут делать ничего, что могло бы спать, например, вызов wait_event, выделение памяти с помощью чего-либо, кроме GFP_ATOMIC, или блокировка семафора
- обработчики не могут назвать расписание.
То, что я пытаюсь сказать, заключается в том, что обработчик прерываний работает в атомном контексте. Они не могут спать, поскольку они не могут быть перенесены. прерывания не имеют контекста процесса резервного копирования
Вышеупомянутое по дизайну. Вы можете делать все, что хотите, в коде, просто будьте готовы к последствиям
Предположим, что вы приобрели блокировку в обработчике прерываний (плохой дизайн). При возникновении прерывания процесс сохраняет свой регистр в стеке и запускает ISR. теперь, после приобретения блокировки, вы оказались бы в тупике, так как их ISR не знает, что делает этот процесс.
Процесс не будет в состоянии возобновить выполнение до тех пор, пока не будет сделано это с ISR
В преимущественном ядре в ISR, и процесс может быть выгружать, но для невытесняющего ядра вы мертвы.
Я думаю, вы запутались. Я спросил, есть ли у вас контекст процесса, а затем прерывается то, что произойдет, если в контексте процесса был заблокирован ... и вы объяснили мне по-другому. – Rahul
Не имеет значения, если контекст процесса удерживает блокировку, он просто будет перенесен.Это то, что обычно происходит, когда контекст процесса содержит блокировку. – duck
Не требуется прерывание, чтобы перенести его, ядро будет автоматически перераспределять его для других процессов, если оно не использует спин-блокировку – duck