Pourquoi la désactivation des interruptions désactive le noyau de la préemption et comment verrou de rotation désactive la préemption
Je suis de lecture Noyau Linux Développement récemment, et j'ai quelques questions liées à la désactivation de préemption.
-
Dans le "Contrôle d'Interruption" du chapitre 7, il est dit:
En outre, la désactivation des interruptions désactive également le noyau de préemption.
J'ai aussi lu dans le livre que le noyau de préemption peut se produire que dans des cas:
Lorsqu'un gestionnaire d'interruption des sorties, avant de retourner à noyau de l'espace.
Lorsque le code du noyau devient preemptible de nouveau.
Si une tâche dans le noyau appelle explicitement schedule()
Si une tâche dans ther noyau blocs (qui se traduit par un appel à l'annexe())Mais je ne peux pas raconter la désactivation des interruptions avec ces cas.
-
Autant que je sache, un spinlock désactiver la préemption avec le preempt_disable() fonction.
Le post Quelles sont exactement les "spin locks"?
dit:Sur un seul core de la machine spinlock est tout simplement un "désactiver les interruptions" ou "raise IRQL qui empêche le fil de la planification complètement.
Ne preempt_disable() désactiver la préemption par la désactivation des interruptions?
OriginalL'auteur feirainy | 2013-12-25
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas un planificateur de gourou, mais je tiens à expliquer comment je vois les choses.
Voici plusieurs choses.
thread_info->preempt_count
variable.Vous pouvez voir ce qui est preempt_disable(). Essayez ceci:
1. Obtenir un spinlock.
2. Horaire d'appel()
Dans le dmesg, vous verrez quelque chose comme "BUG: planification tout en atomique". Cela se produit lorsque le programmateur détecte que votre processus atomique (non préemptif) contexte mais il planifie lui-même.
Bonne chance.
Sans interruptions - pas d'horloge. Pas d'horloge - pas de minuteries.
Quelles seront les conséquences si je ne le désactivez la préemption(pas la désactivation des interruptions) et en même temps d'interruption se produisent dans le système et ce qui va se passer après la désactivation de l'interrompre? et dans ce cas, "preempt_count" variable sera plus efficace. (l'étude de la gestion des interruptions dans les bras)
Mountaniol : "La Grande Écluse (moyens de fermeture de toutes les interruptions sur tous les Processeurs)" Pouvez-vous expliquer cela? Grande écluse est en fait un verrou bien que globale, pour tous les LWPs. Mais il n'a pas d'élève à la désactivation des interruptions.
OriginalL'auteur Sebastian Mountaniol
Dans un test de module de noyau que j'ai écrit pour moniteur/profil d'une tâche, j'ai essayé de désactiver les interruptions par:
1 - à l'Aide de local_irq_save()
2 - à l'Aide de spin_lock_irqsave()
3 - Manuellement disable_irq() pour tous les Irq dans /proc/interrupts
Dans tous les 3 cas, je pourrais toujours utiliser le hrtimer à mesure du temps, même si les Irq ont été désactivés (et une tâche, j'ai été suivi ai mis en pause).
Je trouve ce veeeeerrrryyyy étrange... personnellement, j'attendais à ce que Sebastian Mountaniol souligné -> Sans interruptions - pas d'horloge. Pas d'horloge - pas de minuteries...
Noyau Linux 2.6.32 sur un seul core, PROCESSEUR unique... quelqu'un Peut avoir une meilleure explication ?
Ahhhh.... Très intelligent de mise en œuvre 🙂
OriginalL'auteur fakr00n