2 votes

Quelle pile utilise l'interruption matérielle ?

Je ne comprends pas très bien le mécanisme de commutation de la pile d'interruptions en x86_64 . D'après le manuel du développeur d'Intel, lorsqu'une interruption matérielle se produit, le contexte actuel est stocké dans la mémoire de l'ordinateur. pile d'interruptions pour plus tard iret utiliser. J'ai les questions suivantes :

  1. Est-ce que cette pile hardirq_stack dans le noyau Linux ? Si c'est le cas, cette pile est également utilisée par softirq ; alors comment la pile garde-t-elle sa cohérence lorsqu'une interruption se produit pendant la manipulation softirq ? Si ce n'est pas le cas, quelle pile est utilisée ?
  2. Seule une partie du contexte est sauvegardée sur la pile (par exemple, RSP, CS, RIP), qu'en est-il de l'autre partie (par exemple, les registres) ?

1voto

user123 Points 1039

Si vous lisez ce qui suit : https://www.kernel.org/doc/Documentation/x86/kernel-stacks vous avez des informations sur ce que Linux fait pour les différentes piles.

Comme toutes les autres architectures, x86_64 possède une pile noyau pour chaque thread actif.

Cela signifie que chaque processus/thread dispose d'une pile noyau qui est utilisée pour gérer les appels système. Les libstdc++/libc (implémentations C++/C standard) utilisent directement l'instruction d'assemblage syscall pour effectuer des appels système. Le point d'entrée du noyau est arch/x86/entry/entry_64.S. Ce fichier d'assemblage fera basculer la pile du processus en mode utilisateur vers son homologue du noyau. Ceci se fait pendant un syscall et non pendant une interruption externe. Ce paragraphe a pour but de dissiper les malentendus.

En plus des piles par thread, il existe des piles spécialisées associées à chaque CPU. Ces piles ne sont utilisées que lorsque le noyau est en contrôle sur cette unité centrale ; lorsqu'une unité centrale retourne à l'espace utilisateur les les piles spécialisées ne contiennent aucune donnée utile. Les principales piles de l'unité centrale sont les suivantes :

  • Pile d'interruptions. IRQ_STACK_SIZE

Utilisé pour les interruptions matérielles externes. S'il s'agit de la première interruption externe (c'est-à-dire qu'il ne s'agit pas d'une interruption matérielle imbriquée), le noyau noyau passe de la tâche en cours à la pile d'interruptions. Comme la séparation des threads et des piles d'interruption sur i386, cela donne plus de place plus de place pour le traitement des interruptions du noyau sans avoir à augmenter la taille de chaque pile par thread.

La pile d'interruption est également utilisée lors du traitement d'un softirq.

Le passage à la pile d'interruptions du noyau se fait par logiciel en fonction d'un compteur de nids d'interruptions par CPU.

Cela signifie que chaque CPU possède des piles spécialisées qui sont utilisées pour gérer certains événements spéciaux. Les piles spécialisées ne contiennent pas de données valides lorsqu'elles sont en mode utilisateur.

Le noyau maintient un compteur de nids (interruption d'une interruption). Si le compteur de nids est égal à 0, il bascule la pile du mode utilisateur vers la pile du noyau d'interruption. Sinon, il reste sur la même pile.

Cette pile est-elle hardirq_stack dans le noyau Linux ? Si c'est le cas, cette pile est également utilisée par softirq ; alors comment la pile garde-t-elle sa cohérence lorsqu'une interruption se produit pendant la gestion de softirq ? Si ce n'est pas le cas, quelle pile est utilisée ?

La pile utilisée est la pile d'interruption à la fois pour le hardirq (irq matériel) et le softirq (irq logiciel). La pile reste cohérente car le gestionnaire d'irq pousse tous les registres qui pourraient être utilisés par une interruption imbriquée et maintient un compteur d'imbrication. Le TSS est utilisé pour les irq allant de l'anneau 3 à l'anneau 0 pour changer les piles. Ceci est nécessaire car le passage en mode noyau (anneau 0) ne peut pas être fait par logiciel. Il doit être fait par le matériel. Le TSS est un mécanisme qui permet un passage sûr en mode noyau sur interruption.

Seule une partie du contexte est sauvegardée sur la pile (par exemple, RSP, CS, RIP), qu'en est-il de l'autre partie (par exemple, les registres) ?

Les registres sont également sauvegardés sur la pile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X