![Прерывание прерывания](https://rvso.com/image/168822/%D0%9F%D1%80%D0%B5%D1%80%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%BF%D1%80%D0%B5%D1%80%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F.png)
Я знаю, как работает обработка прерываний (переключение режима, сохранение регистров, изменение стека...). Однако мне интересно, что, если прерывание произойдет, когда мы все еще находимся в режиме ядра, а не в пользовательском режиме?
решение1
Точно так же. Однако если мы обрабатываем прерывание, то, возможно, ничего, или ничего, пока мы не закончим.
Что мы делаем во всех случаях:
- безусловно сохранить режим и установить режим супервизора (выполняется аппаратно. Запускается прерыванием)
- безусловное сохранение состояния и переключение стека
- запустить код прерывания
- безусловное переключение стека обратно, восстановление состояния и восстановление режима
Фразу «установить режим супервизора» можно интерпретировать следующим образом:
- убедитесь, что установлен режим супервизора.
- записать единицу в бит S регистра состояния
Прерывание прерывания
Возможно, существует несколько (но конечных) уровней приоритета прерываний. Для каждого уровня будет свой стек. Прерывание может быть прервано только более высоким приоритетом прерывания. Прерывания с более низким приоритетом могут быть заблокированы более высоким приоритетом. Это решает большинство проблем, а не стеки не могут быть повреждены.
Однако прерывания с более низким приоритетом могут быть заблокированы (включая пользовательские процессы. Это прерывания с самым низким приоритетом). Поэтому важно обеспечить быстроту прерываний (не слишком много кода), особенно для прерываний с более высоким приоритетом: выполните работу и выйдите, пусть прерывание с более низким приоритетом (например, пользовательский процесс) сделает то, что требует времени.
Стеки
Ядро может использовать тот же стек, что и процесс, когда процесс обращается к ядру (синхронный вызов: использование системного вызова в коде программы).
Ядро также будет иметь стек для каждого уровня приоритета прерывания. См. раздел о прерывании прерывания.