Ненадежное руководство по взлому ядра Linux утверждает, что
Вы можете сказать, что находитесь в состоянии аппаратного прерывания, потому что функция in_irq() возвращает значение true.
Внимание. Помните, что это вернет ложное срабатывание, если прерывания отключены (см. ниже).
Действительно ли in_irq()
может возвращать ненулевое значение не в контексте hardirq в ядрах Linux 2.6.32 или новее на x86?
В моих экспериментах с ядром 2.6.32 (Debian 6) и 3.4 (OpenSUSE 12.1) in_irq()
всегда возвращал 0 при вызове из контекста процесса, даже если он вызывался между local_irq_disable()
и local_irq_enable()
. Результаты были такими же, когда я использовал функции спин-блокировки, которые отключают прерывания вместо local_irq*
.
Из исходного кода ядра я в настоящее время не вижу, как in_irq()
может возвращать ложное срабатывание. Может ли кто-нибудь прояснить это?
РЕДАКТИРОВАТЬ: я также пробовал API спин-блокировки *_irqsave()
и *_irq()
, а также local_irq_save()
/local_irq_restore()
, результаты были одинаковыми, то есть in_irq()
возвращал 0, когда прерывания были отключены. Явное отключение прерываний с помощью машинной инструкции cli
на x86 также не заставляло функцию in_irq() возвращать ненулевое значение.