GNU/Linux >> Tutoriels Linux >  >> Linux

Comment le noyau Linux gère les interruptions

Les interruptions sont une partie essentielle du fonctionnement des processeurs modernes. Par exemple, chaque fois que vous appuyez sur une touche du clavier, le processeur est interrompu afin que le PC puisse lire les entrées de l'utilisateur sur le clavier. Cela se produit si rapidement que vous ne remarquez aucun changement ou altération de l'expérience utilisateur.

De plus, le clavier n'est pas le seul composant qui peut provoquer des interruptions. En général, il existe trois types d'événements pouvant provoquer une interruption du processeur :Interruptions matérielles , interruptions logicielles , et exceptions . Avant d'aborder les différents types d'interruptions, je vais définir quelques termes.

Définitions

Une demande d'interruption (IRQ ) est demandé par le contrôleur d'interruption programmable (PIC ) dans le but d'interrompre le CPU et d'exécuter la routine de service d'interruption (ISR ). L'ISR est un petit programme qui traite certaines données en fonction de la cause de l'IRQ. Le traitement normal est interrompu jusqu'à la fin de l'ISR.

Dans le passé, les IRQ étaient gérées par une puce séparée - le PIC - et les périphériques d'E / S étaient directement câblés au PIC. Le PIC gérait les différentes IRQ matérielles et pouvait parler directement au CPU. Lorsqu'une IRQ s'est produite, le PIC a écrit les données sur le CPU et a déclenché la demande d'interruption (INTR ) broche.

De nos jours, les IRQ sont gérés par un contrôleur d'interruption programmable avancé (APIC ), qui fait partie du CPU. Chaque cœur a son propre APIC.

Types d'interruptions

Comme je l'ai mentionné, les interruptions peuvent être séparées en trois types en fonction de leur source :

Interruptions matérielles

Lorsqu'un périphérique matériel veut dire au CPU que certaines données sont prêtes à être traitées (par exemple, une entrée au clavier ou lorsqu'un paquet arrive à l'interface réseau), il envoie un IRQ pour signaler au CPU que les données sont disponibles. Cela appelle un ISR spécifique qui a été enregistré par le pilote de périphérique lors du démarrage du noyau.

Interruptions logicielles

Plus de ressources Linux

  • Aide-mémoire des commandes Linux
  • Aide-mémoire des commandes Linux avancées
  • Cours en ligne gratuit :Présentation technique de RHEL
  • Aide-mémoire sur le réseau Linux
  • Aide-mémoire SELinux
  • Aide-mémoire sur les commandes courantes de Linux
  • Que sont les conteneurs Linux ?
  • Nos derniers articles Linux

Lorsque vous lisez une vidéo, il est essentiel de synchroniser la lecture de la musique et de la vidéo afin que la vitesse de la musique ne varie pas. Ceci est accompli grâce à une interruption logicielle qui est déclenchée de manière répétitive par un système de minuterie précis (appelé jiffies). Cette minuterie permet à votre lecteur de musique de se synchroniser. Une interruption logicielle peut également être invoquée par une instruction spéciale pour lire ou écrire des données sur un périphérique matériel.

Les interruptions logicielles sont également cruciales lorsqu'une capacité en temps réel est requise (comme dans les applications industrielles). Vous trouverez plus d'informations à ce sujet dans l'article Introduction à Linux en temps réel pour les développeurs embarqués de la Fondation Linux. .

Exceptions

Les exceptions sont le type d'interruption que vous connaissez probablement. Lorsque le CPU exécute une commande qui entraînerait une division par zéro ou un défaut de page, toute exécution supplémentaire est interrompue. Dans un tel cas, vous en serez informé par une fenêtre pop-up ou en voyant erreur de segmentation (core dumped) dans la sortie de la console. Mais toutes les exceptions ne sont pas causées par une instruction erronée.

Les exceptions peuvent être subdivisées en défauts , Pièges , et Annule .

  • Défauts : Les défauts sont une exception que le système peut corriger, par exemple, lorsqu'un processus tente d'accéder aux données d'une page mémoire qui a été permutée sur le disque dur. L'adresse demandée se trouve dans l'espace d'adressage du processus et les droits d'accès sont corrects. Si la page n'est pas présente dans la RAM, une IRQ est déclenchée et elle démarre le gestionnaire d'exception de défaut de page pour charger la page mémoire souhaitée dans la RAM. Si l'opération réussit, l'exécution se poursuivra.
  • Pièges : Les pièges sont principalement utilisés pour le débogage. Si vous définissez un point d'arrêt dans un programme, vous insérez une instruction spéciale qui provoque le déclenchement d'un déroutement. Une interruption peut déclencher un changement de contexte qui permet à votre débogueur de lire et d'afficher les valeurs des variables locales. L'exécution peut continuer par la suite. Les interruptions sont également le moyen par défaut d'exécuter des appels système (comme tuer un processus).
  • Abandons : Les abandons sont provoqués par une défaillance matérielle ou des valeurs incohérentes dans les tables système. Un abandon ne signale pas l'emplacement de l'instruction qui provoque l'exception. Ce sont les interruptions les plus critiques. Un abandon invoque le gestionnaire d'exception d'abandon du système , qui met fin au processus qui l'a provoqué.

Prendre en main

Les IRQ sont classées par priorité dans un vecteur sur l'APIC (0=priorité la plus élevée). Les 32 premières interruptions (0 à 31) ont une séquence fixe spécifiée par le CPU. Vous pouvez en trouver un aperçu sur la page des exceptions d'OsDev. Les IRQ suivantes peuvent être affectées différemment. La table des descripteurs d'interruption (IDT ) contient l'affectation entre IRQ et ISR. Linux définit un vecteur IRQ de 0 à 256 pour l'affectation.

Pour imprimer une liste des interruptions enregistrées sur votre système, ouvrez une console et tapez :

cat /proc/interrupts

Vous devriez voir quelque chose comme ceci :

De gauche à droite, les colonnes sont :vecteur IRQ, nombre d'interruptions par CPU (0 .. n ), la source matérielle, les informations de canal de la source matérielle et le nom du périphérique à l'origine de l'IRQ.

Au bas du tableau, il y a des interruptions non numériques. Ce sont les interruptions spécifiques à l'architecture, comme l'interruption du minuteur local (LOC ) sur l'IRQ 236. Certains d'entre eux sont spécifiés dans la disposition vectorielle de l'IRQ Linux dans l'arborescence des sources du noyau Linux.

Pour obtenir une vue en direct de ce tableau, exécutez :

watch -n1 "cat /proc/interrupts"

Conclusion

Une bonne gestion des IRQ est essentielle pour la bonne interaction du matériel, des pilotes et des logiciels. Heureusement, le noyau Linux fait un très bon travail, et un utilisateur de PC normal ne remarquera presque rien sur la gestion complète des interruptions du noyau.

Cela peut devenir très compliqué, et cet article ne donne qu'un bref aperçu du sujet. Les bonnes sources d'informations pour approfondir le sujet sont Linux Inside eBook (CC BY-NC-SA 4.0) et le référentiel d'enseignement du noyau Linux.


Linux
  1. Comment Linux est arrivé sur le mainframe

  2. Le cycle de vie des tests du noyau Linux

  3. Comment mettre à niveau le noyau sur Linux Desktop

  4. Comment vérifier HZ dans le terminal?

  5. Comment une interruption est-elle gérée sous Linux ?

Comment compiler un noyau Linux au 21e siècle

Comment vérifier la version du noyau sous Linux

Comment mettre à niveau le noyau Linux sur CentOS 7

Comment installer le dernier noyau Linux sur CentOS 7

Comment Linux charge-t-il l'image 'initrd' ?

Comment Linux conserve-t-il le contrôle du processeur sur une machine monocœur ?