Unreliable Guide To Hacking The Linux Kernel afferma cheIn_irq() è affidabile?
si può dire di essere in un interrupt di processo, perché in_irq() restituisce true.
Attenzione. Fai attenzione che questo restituirà un falso positivo se gli interrupt sono disabilitati (vedi sotto).
E 'davvero il caso che in_irq()
può restituire non-zero non nel contesto hardirq nei kernel Linux 2.6.32 o più recenti su x86?
Nei miei esperimenti con il kernel 2.6.32 (Debian 6) e 3.4 (OpenSUSE 12.1), in_irq()
sempre restituito 0 quando viene chiamato da un contesto di processo, anche se è stato chiamato tra il local_irq_disable()
e . I risultati erano gli stessi quando ho usato le funzioni di spinlock che disabilitano gli interrupt invece di local_irq*
.
dal codice sorgente del kernel, che al momento non riesco a vedere come in_irq()
può restituire un falso positivo. Qualcuno potrebbe chiarirlo?
EDIT: Ho anche provato sia API spinlock *_irqsave()
e *_irq()
nonché local_irq_save()
/local_irq_restore()
, i risultati erano gli stessi, cioè, in_irq()
restituito 0 quando gli interrupt sono stati disattivati. Disabilitare gli interrupt in modo esplicito tramite l'istruzione della macchina cli
su x86 non ha forzato in_irq() di restituire un valore diverso da zero.
CONFIG_PREEMPT è "y", ovviamente. Sì, ho controllato * _irqsave, * _irq e * _bh varianti dell'API spinlock. In ogni caso, 'in_irq()' ha restituito 0 anche quando uno spinlock è stato bloccato. – Eugene
Sì, ho visto l'implementazione di 'in_irq()'. Questo è il motivo per cui non capisco perché non produce falsi positivi sulle mie macchine. – Eugene
'in_irq()' restituisce un valore diverso da zero quando uno spinlock è bloccato o gli interrupt sono disabilitati in qualche altro modo negli esperimenti? – Eugene