La différence entre la porte D'appel, la porte D'interruption, la porte de trappe?

j'étudie le Mode protégé Intel. J'ai trouvé que la porte D'appel, la porte D'interruption, la porte de trappe sont presque identiques. En fait, outre que la porte D'appel a les champs pour le compteur de paramètres, et que ces 3 portes ont des champs de type différents, ils sont identiques dans tous les autres champs.

quant à leurs fonctions, elles sont toutes utilisées pour transférer le contrôle du code dans une procédure à l'intérieur d'un segment de code.

je me demande, puisque ces 3 portes contiennent toutes l'information nécessaire pour l'appel au-delà des limites des privilèges. Pourquoi avons-nous besoin de 3 types d'eux? N'est-ce pas 1 juste assez bon?

Merci pour votre temps et votre réponse.

"151980920 mise à jour" Update 1

une question connexe: quand utiliser la porte D'interruption ou la porte de trappe?

mise à jour 2

aujourd'Hui, je suis venu avec cette pensée:

but différent, portes différentes, et avec différents détails de comportement CPU effectuée. Comme la manipulation du drapeau.

33
demandé sur Community 2010-08-06 19:09:10

3 réponses

une porte (appel, interruption, tâche ou trappe) est utilisée pour transférer le contrôle de l'exécution à travers les segments. Le niveau de privilège vérification se fait différemment selon le type de destination et d'instruction.

une porte d'appel utilise les instructions CALL et JMP. Appelez gates pour transférer le contrôle du code de privilège inférieur au code de privilège supérieur. Le DPL de la porte est utilisé pour déterminer quels niveaux de privilèges ont accès à la porte. Appelez les portes sont (ou ont été, probablement) progressivement abandonné en faveur du mécanisme SYSENTER/SYSEXIT, qui est plus rapide.

portes de tâche sont utilisés pour le soutien de matériel multitâche. Un commutateur de tâche matérielle peut se produire volontairement (appel/JMP vers un descripteur de porte de tâche), ou par une interruption ou un IRET lorsque le drapeau NT est activé. Cela fonctionne de la même manière avec les portes d'interruption ou de piège. Les portes de tâche ne sont pas utilisées, au meilleur de ma connaissance, car les noyaux veulent généralement que du travail supplémentaire soit fait lors du changement de tâche.

les portes D'interruption et de trappe, ainsi que les portes de tâche, sont connus comme la Table de descripteur D'interruption. Ils fonctionnent de la même manière que les gates d'appel, sauf le transfert de paramètres, d'une pile de privilèges à une autre. Une différence est que les portes d'interruption dégagent le bit IF dans les EFLAGS, alors que les portes de piège ne le font pas. Cela les rend idéales pour servir les interruptions matérielles. Les pièges sont largement utilisés dans la virtualisation assistée par le matériel.

pour plus d'informations, voir L'Architecture Intel Manuels sur les processeurs qui vous intéressent.

mise à Jour

pour répondre au commentaire:

il y a de nombreuses raisons de distinguer les interruptions des pièges. La première est la différence dans la portée: les portes d'interruption pointent vers l'espace du noyau (après tout, c'est le noyau qui gère le matériel) tandis que les pièges sont appelés dans l'espace utilisateur. Les gestionnaires d'interruption sont appelés en réponse à des événements matériels, tandis que les traps sont exécutés en réponse à un CPU. instruction.

pour un exemple simple (mais impraticable) pour mieux comprendre pourquoi les portes d'interruption et de piège traitent les EFLAGS différemment, considérez ce qui se produirait dans le cas où nous écrivions un gestionnaire d'interruption pour des événements matériels sur un système uniprocesseur et nous ne pourrions pas effacer le si bit pendant que nous en servions un. Il serait possible qu'une deuxième interruption arrive alors que nous étions occupés à servir la première. Ensuite, notre gestionnaire d'interruption serait appelé par le processeur au hasard point pendant notre exécution. Cela pourrait conduire à la corruption de données, l'impasse, ou d'autres mauvaises magie. Pratiquement, d'interrompre la désactivation est l'un des mécanismes pour s'assurer qu'une série de noyau d'états est traité comme une section critique.

l'exemple ci-dessus suppose des interruptions masquées. Vous ne voudriez pas ignorer NMIs, de toute façon.

c'est largement hors de propos aujourd'hui, aussi. Aujourd'hui il n'y a pratiquement aucune distinction entre rapide et les manipulateurs d'interruption lente (recherche de" manipulateurs rapides et lents"), les manipulateurs d'interruption peuvent s'exécuter de manière imbriquée, les processeurs SMP rendent obligatoire de coupler l'interruption locale avec des serrures de spin, et ainsi de suite.

maintenant, les trappes sont en effet utilisées pour servir les interruptions de logiciel, les exceptions, etc. Un défaut ou une division de page par exception zéro dans votre processeur est probablement manipulé par une porte de piège. L'exemple le plus simple de l'utilisation de trappes pour contrôler l'exécution du programme est L'instruction INT 3, qui est utilisée pour implémenter les points de rupture dans les débogueurs. Lors de la virtualisation, ce qui se passe, c'est que l'hyperviseur tourne dans le ring 0, et le noyau invité habituellement dans le ring 1 - où le code privilégié échouerait avec une erreur d'exception générale. Witchel et Rosenblum développé traduction binaire , qui est essentiellement réécrire des instructions pour simuler leurs effets. Les instructions critiques sont découvertes et remplacées par des pièges. Puis lorsque le piège s'exécute, le contrôle est cédé au VMM/hyperviseur, qui est chargé d'émuler les instructions critiques de l'anneau 0.

avec la virtualisation assistée par le matériel, la technique trap-and-emulate a été quelque peu limitée dans son utilisation (car elle est très coûteuse, surtout quand elle est dynamique) mais la pratique de la traduction binaire est encore largement utilisé .

Pour plus d'informations, je vous suggère de vérifier:

  • pilotes de périphériques Linux, troisième édition (disponible en ligne )
  • pour la traduction binaire, QEMU est un excellent début.
  • Concernant piège-et-imiter, découvrez comparaison entre logiciels et matériels techniques.

Espérons que cette aide!

53
répondu Michael Foukarakis 2010-08-07 07:16:54

Architecture et Design

du point de vue de la protection, l'architecture x86 est basée sur des anneaux hiérarchiques, selon lesquels tout l'espace d'exécution fourni par le processeur est divisé en quatre domaines de protection hiérarchique , dont chacun a son propre niveau de privilèges assignés. Cette conception suppose que la plupart du temps le code sera exécuté dans le domaine le moins privilégié et parfois les services à partir du plus le domaine de sécurité privilégié sera demandé et ces services préviendront les activités moins privilégiées sur la pile et la restaureront ensuite de telle sorte que toute préemption sera invisible pour le code moins privilégié.

la conception des domaines de protection hiérarchisés stipule que le contrôle ne peut pas être transmis arbitrairement entre différents domaines de sécurité.

une porte est une caractéristique de l'architecture x86 pour le transfert de contrôle des moins privilégiés codez les segments vers les plus privilégiés, mais pas l'inverse. En outre, le point dans le segment moins privilégié d'où le contrôle sera passé peut être arbitraire, mais le point dans le segment plus privilégié où le contrôle sera passé est strictement spécifié. Le passage de la commande arrière au segment moins privilégié n'est autorisé que par l'instruction IRET . En ce qui concerne les Intel Logiciel manuel du développeur affirme:

Modules de Code

en bas les segments de privilèges ne peuvent accéder aux modules fonctionnant sur des segments de privilèges supérieurs qu'au moyen d'une interface protégée et strictement contrôlée appelée une porte. Les tentatives d'accéder à des segments de privilèges supérieurs sans passer par une barrière de protection et sans avoir de droits d'accès suffisants entraînent une exception générale de protection ( #GP ).

en d'autres termes, une porte est un point d'entrée de domaine privilégié avec les droits d'accès requis et une cible adresse. De cette façon, toutes les portes sont similaires et utilisées à des fins presque identiques, et tous les descripteurs de portes contiennent le champ DPL, qui est utilisé par le processeur pour contrôler les droits d'accès. Mais notez que le processeur vérifie le DPL de la gate seulement si la source de l'appel était un logiciel CALL , JMP , ou INT instruction, et contourne cette vérification lorsque la source de l'appel est un matériel.

Types de portes

malgré le fait que tout les portes sont similaires, elles ont quelques différences parce qu'à l'origine, les ingénieurs D'Intel pensaient que des portes différentes seraient utilisées à des fins différentes.

Tâche "À La Porte De 1519420920"

une porte de tâche ne peut être stockée qu'en IDT et GDT et appelée par une instruction INT . C'est un type très spécial de porte qui diffère significativement des autres.

initialement, les ingénieurs Intel ont pensé qu'ils allaient révolutionner le multitâche en fourniture d'une fonctionnalité basée sur CPU pour la commutation de tâches. Ils ont introduit TSS (segment D'État de tâche) qui tient les registres de l'état de la tâche et peut être utilisé pour la commutation de tâche matérielle. Il y a deux façons de déclencher la commutation matérielle des tâches: en utilisant TSS lui-même et en utilisant Task Gate. Pour faire le commutateur de tâches matériel, vous pouvez utiliser les instructions CALL ou JMP . Si je comprends bien, la raison principale de l'introduction de la porte de tâche était d'avoir la capacité de déclencher des commutateurs de tâche matériel en réponse à l'arrivée de l'interruption, parce qu'un commutateur de tâche matériel ne peut pas être déclenché par un JMP vers le sélecteur TSS.

en réalité, personne ne l'utilise ni la commutation de contexte matériel. En pratique, cette fonctionnalité n'est pas optimale du point de vue de la performance et n'est pas pratique à utiliser. Par exemple, compte tenu du fait que TSS ne peut être stocké qu'en GDT et que la longueur de GDT ne peut pas dépasser 8192, nous ne pouvons pas avoir plus de tâches 8k du point de vue matériel vue.

Piège "À La Porte De 1519420920"

une trappe ne peut être stockée qu'en IDT et appelée par une instruction INT . Il peut être considéré comme un type de base de la porte. Il passe simplement le contrôle à l'adresse particulière spécifiée dans le descripteur trap gate dans le segment plus privilégié et rien de plus. Les trappes activement utilisées à des fins différentes, qui peuvent inclure:

  • mise en œuvre de l'appel système (par exemple Linux utiliser INT 0x80 et Windows utiliser INT 0x2E à cette fin)
  • mise en œuvre de la gestion des exceptions (nous n'avons aucune raison de désactiver les interruptions en cas d'exception).
  • interrompre la gestion de l'implémentation sur les machines avec APIC (nous pouvons mieux contrôler la pile du noyau).

Entrupgate

une porte D'interruption ne peut être stockée qu'en IDT et appelée par une instruction INT . Il est le même que trap gate, mais en outre l'appel de porte d'interruption interdit en outre l'acceptation future d'interruption par le nettoyage automatique du drapeau IF dans le registre EFLAGS.

portes D'interruption utilisées activement pour la mise en œuvre de la gestion des interruptions, en particulier sur les machines basées sur le PIC. La raison en est la nécessité de contrôler la profondeur de la cheminée. Le PIC n'a pas la fonction de priorités des sources d'interruption. En raison de cela par défaut, le PIC ne désactive que l'interruption qui est déjà manipulation en Processeur. Mais une autre interruption peut encore arriver au milieu et prévenir la manipulation de l'interruption. Il peut donc y avoir 15 gestionnaires d'interruption sur la pile du noyau au même moment. En conséquence, les développeurs du noyau ont été forcés soit d'augmenter la taille de la pile du noyau de manière significative, ce qui entraîne la pénalité de mémoire, soit d'être prêts à faire face à un débordement sporadique de la pile du noyau. La porte d'interruption peut fournir la garantie qu'un seul gestionnaire peut être sur la pile du noyau en même temps.

Appel "À La Porte De 1519420920"

une porte D'appel peut être stockée dans GDL et LDT et appelée par les instructions CALL et JMP . Similaire à trap gate, mais en plus peut passer le nombre de paramètres de la pile de tâches du mode utilisateur à la pile de tâches du mode noyau. Le nombre de paramètres transmis est spécifié dans l'appel porte descripteur.

les portes D'appel n'ont jamais été populaires. Il y a peu de raisons à cela:

  • ils peuvent être remplacé par des trappes (rasoir D'Occam).
  • ils ne transportent pas beaucoup. D'autres processeurs n'ont pas de telles fonctionnalités, ce qui signifie que la prise en charge des gates d'appel pour les appels système est un fardeau lors du portage du système d'exploitation car ces appels doivent être réécrits.
  • ils ne sont pas trop flexibles, en raison du fait que la quantité de paramètres qui peuvent être transmis entre les piles est limitée.
  • ils ne sont pas optimaux du point de vue de la performance.

à la fin des années 1990, Intel et AMD ont introduit des instructions supplémentaires pour les appels système: SYSENTER / SYSEXIT (Intel) et SYSCALL / SYSRET (AMD). Contrairement aux bornes d'appel, les nouvelles instructions offrent des avantages de rendement et ont été adoptées.

résumé

Je ne suis pas D'accord avec Michael Foukarakis. Désolé, mais il n'y a aucune différence entre les interruptions et les pièges sauf affectant le drapeau IF .

  • en théorie, chaque type de porte peut servir d'interface pointant vers un segment avec n'importe quel niveau de privilèges. Dans la pratique, dans le système d'exploitation moderne en usage, seules les portes d'interruption et de trappe, qui sont utilisées dans IDT pour les appels système, les interruptions et la gestion des exceptions, et en raison de cela tout cela servent de point d'entrée du noyau.

  • tout type de barrière (y compris les barrières de sécurité) et tâche) peut être invoquée dans le logiciel en utilisant une instruction INT . La seule fonctionnalité qui peut interdire l'accès au code de mode utilisateur à une porte particulière est DPL. Par exemple, lorsque le système d'exploitation construit IDT, quels que soient les types des portes particulières, la configuration du noyau DPL des portes qui seront utilisées pour la gestion des événements matériels à 0 et selon cet accès à ces portes sera autorisé seulement à partir de l'espace du noyau (qui tourne au domaine le plus privilégié), mais quand il configure la porte pour le appel système, il a mis DPL à 3 pour permettre l'accès à cette porte à partir de n'importe quel code. En conséquence, la tâche de mode utilisateur est capable de faire des appels système en utilisant la porte avec DPL = 3, mais attrapera un défaut de Protection générale sur la tentative d'appeler le gestionnaire d'interruption de clavier, par exemple.

  • tout type de porte dans IDT peut être invoqué par le matériel. Les gens utilisent les portes d'interruption pour ce matériel de gestion des événements seulement dans les cas où ils veulent obtenir une certaine synchronisation. Par exemple, pour assurez-vous que le débordement de la pile du noyau est impossible. Par exemple, j'ai une expérience réussie de l'utilisation de trap gates pour la gestion des interruptions matérielles sur le système basé sur APIC.

  • de la même manière, la porte de n'importe quel type dans IDT peut être appelée dans le logiciel. La raison de l'utilisation de trap gates pour l'appel système et les exceptions est simple. Aucune raison de désactiver les interruptions. La désactivation des interruptions est une mauvaise chose, car elle augmente les temps de traitement des interruptions et augmenter la probabilité d'interruption perdu. A cause de cela, personne ne pourra les désactiver sans raison sérieuse.

  • interrompre handler habituellement écrit dans un style strictement rentrant. De cette façon, les gestionnaires d'interruption ne partagent généralement pas de données et peuvent se préempter les uns les autres de manière transparente. Même lorsque nous avons besoin d'exclure mutuellement l'accès simultané aux données dans le gestionnaire d'interruption, nous ne pouvons protéger que l'accès aux données partagées en utilisant cli et sti instruction. Aucune raison de considérer un gestionnaire d'interruption entier comme une section critique. Aucune raison d'utiliser les portes d'interruption, si ce n'est le désir d'empêcher un éventuel débordement de la pile du noyau sur les systèmes à base de PIC.

le trap gates est une solution par défaut pour l'interfaçage du noyau. La porte d'interruption peut être utilisée à la place de la porte de trappe s'il y a une raison sérieuse pour cela.

15
répondu ZarathustrA 2018-03-23 02:58:10

une porte D'interruption est spéciale car le drapeau IF est automatiquement désactivé. Une porte D'appel est spéciale parce qu'elle n'est pas activée par un vecteur d'interruption. Une porte de tâche est spéciale car elle sauve automatiquement l'état du processeur. Quatre comportements distincts, avoir quatre noms pour eux est pratique.

8
répondu Hans Passant 2010-08-06 17:23:59