Что происходит, когда код ядра прерывается? - PullRequest
2 голосов
/ 27 мая 2011

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 27 мая 2011

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

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

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

1 голос
/ 27 мая 2011

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

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

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

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

...