Ограничения во время выполнения ядром процедуры ISR
Каковы некоторые из важных do и dont внутри режима ядра и процедуры ISR ? Например -
- отключено ли переключение контекста при запуске обработчика прерываний ?
- может ли произойти переключение контекста, когда процесс находится внутри критического
секция ? - Какие обстоятельства внутри режима ядра требуют отключения дальнейших прерываний ?
Как может произойти переключение процесса на странице-ошибка, когда процесс получает данные с диска, но не происходит во время других случаев прерываний. Как вы классифицируете, если исполняемый путь может быть прерван / перенесен/опережен ?
Что еще нужно помнить, когда процесс находится в режиме ядра или обрабатывает процедуру ISR ?
1 ответ:
Короче говоря: никакого переключения контекста, никогда.
Это означает:
- никакого вытеснения
- никаких блокировок на мьютексах (вместо этого используйте spin-блокировки и убедитесь, что ваши коллеги, не являющиеся ISR, получают их с помощью spin_lock_irqsave для отключения IRQ)
- нет вызова любой функции ядра, которая может спать (проверьте документацию функции, некоторые функции также имеют варианты _cansleep).
Переключение процесса может произойти при ошибке страницы, но это происходит после соответствующий ISR был обработан. В принципе, путь может быть запланирован, если он не является ISR и если у вас нет блокировки spinlock. Если вы держите спинлок, вы должны избегать сна, пока он не будет освобожден.
Поскольку ISR очень сдержанны, то обработка IRQ обычно разделяется между верхней половиной (которая работает в контексте ISR и выполняет критическую работу) и нижней половиной (которая работает позже как поток ядра и делает все, что может быть отложено), которая может спать. Смотрите эту страницу для получения дополнительной информации информация: