Прерывание прерывания

Прерывание прерывания

Я знаю, как работает обработка прерываний (переключение режима, сохранение регистров, изменение стека...). Однако мне интересно, что, если прерывание произойдет, когда мы все еще находимся в режиме ядра, а не в пользовательском режиме?

решение1

Точно так же. Однако если мы обрабатываем прерывание, то, возможно, ничего, или ничего, пока мы не закончим.

Что мы делаем во всех случаях:

  • безусловно сохранить режим и установить режим супервизора (выполняется аппаратно. Запускается прерыванием)
  • безусловное сохранение состояния и переключение стека
  • запустить код прерывания
  • безусловное переключение стека обратно, восстановление состояния и восстановление режима

Фразу «установить режим супервизора» можно интерпретировать следующим образом:

  • убедитесь, что установлен режим супервизора.
  • записать единицу в бит S регистра состояния

Прерывание прерывания

Возможно, существует несколько (но конечных) уровней приоритета прерываний. Для каждого уровня будет свой стек. Прерывание может быть прервано только более высоким приоритетом прерывания. Прерывания с более низким приоритетом могут быть заблокированы более высоким приоритетом. Это решает большинство проблем, а не стеки не могут быть повреждены.

Однако прерывания с более низким приоритетом могут быть заблокированы (включая пользовательские процессы. Это прерывания с самым низким приоритетом). Поэтому важно обеспечить быстроту прерываний (не слишком много кода), особенно для прерываний с более высоким приоритетом: выполните работу и выйдите, пусть прерывание с более низким приоритетом (например, пользовательский процесс) сделает то, что требует времени.

Стеки

Ядро может использовать тот же стек, что и процесс, когда процесс обращается к ядру (синхронный вызов: использование системного вызова в коде программы).

Ядро также будет иметь стек для каждого уровня приоритета прерывания. См. раздел о прерывании прерывания.

Связанный контент