re-input des interruptions sous Linux

Je lisais "pilotes de périphériques Linux, 3ème édition" et ne include pas complètement une partie décrivant les gestionnaires d'interruption. Je voudrais préciser:

  • les gestionnaires d'interruption dans Linux sont-ils non-préemptibles?
  • sont les gestionnaires d'interruption dans Linux non-réentrant?

Je crois comprendre le model des moitiés Top / Bottom très bien, et selon cela les interruptions sont désactivées aussi longtime que le TopHalf est en cours d'exécution, donc le gestionnaire ne peut pas être rentré, n'est-ce pas?

Mais qu'en est-il des interruptions de haute priorité? Sont-ils pris en charge par vanilla Linux ou des extensions spécifiques en time réel uniquement? Que se passe-t-il si une interruption de faible priorité est interrompue par une priorité haute?

Le kernel Linux est réentrant (comme tous les UNIX), ce qui signifie simplement que plusieurs process peuvent être exécutés par le CPU. Il n'a pas besoin d'attendre que la lecture de l'access au disque soit gérée par le controller HDD lente, le processeur peut traiter d'autres choses jusqu'à ce que l'access au disque soit terminé (ce qui triggersra une interruption si c'est le cas).

Généralement, une interruption peut être interrompue par une autre interruption (préemption), appelée «exécution nestede». En fonction de l'architecture, certaines fonctions critiques doivent fonctionner sans interruption (non préemptive) en désactivant complètement les interruptions. Sur x86, ce sont quelques fonctions pertinentes dans le time ( time.c , hpet.c ) et quelques trucs xen .

Il n'y a que deux niveaux de priorité concernant les interruptions: 'activer toutes les interruptions' ou 'désactiver toutes les interruptions', donc je suppose que votre "interruption de haute priorité" est la seconde. C'est le seul comportement que le kernel Linux connaît concernant les priorités d'interruption et n'a rien à voir avec les extensions en time réel.

Si une interruption interruptible (votre "interruption de basse priorité") est interrompue par une autre interruption ("high" ou "low"), le kernel enregistre l'ancien code d'exécution de l'interruption interrompue et commence à traiter la nouvelle interruption. Cette "imbrication" peut se produire plusieurs fois et peut ainsi créer plusieurs niveaux d'interruptions interrompues. Ensuite, le kernel recharge le code sauvegardé de l'ancienne interruption et essaie de terminer l'ancien.

Non préemptif signifie que ces gestionnaires ne peuvent pas être interrompus par une autre interruption.

Pour les gestionnaires non préemptibles, la réentrance n'est pas un problème puisque vous ne pouvez pas les interrompre en premier lieu.

Quant à ce que le kernel fait, il suffit de vérifier la réponse de wag, je ne peux pas commenter comme il le fait sur ce sujet.