Что происходит, когда код ядра прерывается?


Я читаю концепции операционных систем (Silberschatz, Galvin, Gagne), 6-е издание, глава 20. Я понимаю, что код ядра Linux не подлежит вытеснению (до версии 2.6). Но его можно прервать аппаратными прерываниями. Что произойдет, если ядро находилось в середине критической секции и произошло прерывание, и оно тоже выполнило критическую секцию?

Из того, что я прочитал в книге:

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

Хорошо, эта схема используется, когда ISR имеет критическое сечение. Но это будет только расстраивать дальнейшие прерывания. Как насчет кода ядра, который был прерван этим прерыванием в первую очередь?

2 2

2 ответа:

Но это будет только расстраивать дальнейшие прерывания. Как насчет кода ядра, который был прерван этим прерыванием в первую очередь?

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

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

Код ядра, который был прерван этим прерыванием в первую очередь, прерывается.

Вот почему написание обработчиков прерываний является такой болезненной задачей: они не могут сделать ничего, что поставило бы под угрозу корректность основного потока выполнения.

Например, ядро xnu компании Apple обрабатывает большинство видов прерываний устройств, записывая информацию из прерывания в запись в памяти, добавляя эту запись в очередь, а затем возобновляя нормальное выполнение; ядро затем берет прерывания из очереди некоторое время спустя (в основном цикле планировщика, я полагаю). Таким образом, обработчик прерываний взаимодействует только с остальной частью системы через очередь прерываний, и существует небольшая опасность возникновения проблем.

Есть немного середины; на многих архитектурах (включая x86) привилегированный код может маскировать прерывания, чтобы они не вызывали прерывания. Это может быть использовано для защиты отрывков кода, которые действительно не стоит прерывать его. Однако эти архитектуры, как правило, также имеют немаскируемые прерывания, которые игнорируют маскировку, поэтому прерывание все еще должно быть рассмотрено.