Content-type: text/html
Le gestionnaire haut (enregistré par request_irq(9)) se contente généralement de déplacer des données entre un périphérique et un tampon en mémoire, et de s'assurer que le périphérique est dans un état normal. Tant que ce gestionnaire est en cours d'éxécution, l'interruption correspondante est désactivée. S'il s'agit d'un gestionnaire d'interruption rapide (i.e., si SA_INTERRUPT est positionné), toutes les interruptions sont désactivées.
Le gestionnaire bas fait ce qu'il reste à traiter pour l'interruption correspondante. Un gestionnaire bas est éxécuté alors que les interruptions sont autorisées. Cependant, un mécanisme de blocage assure qu'une seule instance d'un gestionnaire bas donné est exécutée à un instant donné. Les gestionnaires bas sont lancés par do_bottom_half(), qui est appelé par schedule() et ret_from_sys_call().
init_bh() installe routine() en tant que gestionnaire bas numéro nr. Cela est réalisé par l'ajout d'une entrée au tableau bh_base[] , et le positionnement du bit approprié du vecteur bh_mask . Plutôt que forcer un numéro explicite, il est recommandé d'ajouter une entrée à l'énumération anonyme dans include/linux/interrupt.h.
remove_bh() enlève le gestionnaire bas numéro nr de la liste des gestionnaires bas. L'entrée correspondante est enlevée de bh_base[] le bit approprié de bh_mask est réinitialisé.
mark_bh() demande au noyau d'éxécuter le gestionnaire bas correspondant dès que possible. Cette fonction n'est normalement appelée que par le gestionnaire haut d'un gestionnaire d'interruptions. Il fonctionne en positionnant le bit correspondant du vecteur bh_active .
disable_bh() désactive le gestionnaire bas numéro nr en réinitialisant le bit approprié de bh_mask. Cette fonction incrémente également bh_mask_count[nr], qui est utilisé pour assurer que des appels imbriqués à disable_bh() doivent correspondre à un nombre égal d'appels à enable_bh().
enable_bh() active un gestionnaire bas précédemment désactivé par disable_bh(). Cette fonction décrémente bh_mask_count[nr]. Ensuite, si cette valeur est zéro, le gestionnaire bas correspondant est activé en positionnant le bit approprié de bh_mask.
include/asm*/softirq.h, include/linux/interrupt.h, kernel/softirq.c
lqKernel Kornerrq dans l'article 26 du magazine The Linux Journal comprend un article sur les gestionnaires bas d'interruptions sous Linux. Une copie en est disponible sur le web à http://www.ssc.com/lj/issue26/interrupt.html.