2016-11-09 2 views
1

Je suis en train de lire le manuel Intel 3A Chapitre 6 Interruptions et gestion des exceptions.Quelle est la différence entre une interruption générée par logiciel et une exception générée par un logiciel?

Interrupt et Exception ont respectivement 3 sources.

de logiciels générés Interrompre, il dit:

L'instruction INT n permet interruptions d'être générées à partir de logiciel en fournissant un numéro de vecteur d'interruption comme opérande. Pour l'exemple , l'instruction INT 35 force un appel implicite au gestionnaire d'interruption pour l'interruption 35. N'importe lequel des vecteurs d'interruption 0 à 255 peut être utilisé en tant que paramètre dans cette instruction. Si le vecteur NMI prédéfini du processeur est utilisé, la réponse du processeur ne sera pas la même que celle d'une interruption NMI générée normalement. Si le vecteur numéro 2 (le vecteur NMI ) est utilisé dans cette instruction, le gestionnaire d'interruption NMI est appelé , mais le matériel de traitement NMI du processeur n'est pas activé. Les interruptions générées dans un logiciel avec l'instruction INT n ne peuvent pas être masquées par l'indicateur IF dans le registre EFLAGS.

Pour Exceptions aux logiciels générés, il dit:

INTO, INT 3 et instructions BOUND exceptions de permis d'être générés dans le logiciel. Ces instructions permettent de vérifier les conditions d'exception à effectuer aux points du flux d'instructions. Pour l'exemple , INT 3 génère une exception de point d'arrêt. L'instruction INT n peut être utilisée pour émuler des exceptions dans un logiciel; mais il est une limitation. Si INT n fournit un vecteur pour l'une des exceptions définies par l'architecture , le processeur génère une interruption vers le vecteur correct (pour accéder au gestionnaire d'exceptions) mais ne transmet pas un code d'erreur sur la pile. Cela est vrai même si l'exception générée par le matériel associée à génère normalement un code d'erreur . Le gestionnaire d'exceptions tentera toujours d'afficher un code d'erreur à partir de la pile tout en gérant l'exception. Parce qu'aucun code d'erreur n'a été poussé, le gestionnaire va sauter et rejeter l'EIP à la place (en place du code d'erreur manquant). Cela renvoie le mauvais emplacement .

Alors, quelle est la différence? Semble les deux tirer parti de l'instruction int n. Comment puis-je savoir s'il génère une exception ou une interruption dans un code d'assemblage?

+0

Il s'agit d'un détail obscur qui n'a d'importance que pour quelqu'un qui écrit un système d'exploitation en mode protégé. Comme indiqué, il ferait mieux de s'assurer qu'un INTn avec n <32 génère également une exception ou que le gestionnaire d'interruption va mal se comporter. Fait en ayant la porte force une transition en anneau (aka DPL

Répondre

2

Dans l'architecture x86, une exception est traitée comme une interruption, en principe avec un gestionnaire d'interruption.
Donc, les interruptions et les exceptions sont des termes qui se chevauchent, ces derniers sont une sorte de premier.

Les numéros d'interruption compris entre 0 et 31 sont réservés aux exceptions d'unité centrale, par exemple le numéro d'interruption 0 est #DE (erreur de division), le numéro d'interruption 13 est #GP (protection générale).Lorsque la CPU détecte une condition devant déclencher une exception (comme un accès à une page non présente), elle exécute une série de tâches. Tout d'abord, il pousse un code d'erreur si nécessaire, certaines exceptions (comme #PF et #GP) font, certains (comme #DE) ne le font pas.
La section 6.15 du Intel manual 2 répertorie toutes les exceptions avec leur code d'erreur éventuel.

Deuxièmement, il "appelle" le gestionnaire d'interruptions approprié qui est comme un appel distant mais avec EFLAGS poussé sur la pile.

int n ne fait que la deuxième étape, il appelle une interruption mais ne pousse pas de code d'erreur car il n'y a pas de condition d'erreur dans le matériel en premier lieu (et parce que int n était là avant le concept de codes d'erreur).
Donc, il peut être utilisé pour émuler exceptions, le logiciel doit éventuellement pousser un code d'erreur approprié.

Lorsque vous voyez int n dans le code, il est jamais et exception. C'est une interruption, qui est finalement utilisée pour diriger le flux de contrôle dans un gestionnaire d'exceptions OS particulier.


Trivia: int 3 est particulier car il est codé comme CC qui est seulement un octet (normal int nCD imm8 est). Ceci est utile pour le débogage, car le débogueur peut le placer n'importe où dans le segment de code.
into génère uniquement l'exception #OF si OF = 1.

+0

Merci beaucoup. Donc, ma compréhension est maintenant, Exception * peut * avoir un code d'erreur. L'interruption * ne le sera pas *. L'exception peut être classée comme "Fault", "Trap", "Abort". Et j'ai vérifié le vecteur 0 ~ 31, tous appartiennent à l'un de ces 3 types mais le vecteur 3, qui est NMI, une interruption. Les exceptions sont de l'interne du processeur, tandis que l'interruption de l'externe du processeur. – smwikipedia

+0

BTW, que signifie le «imm8»? Et pourquoi être codé sur un seul octet fait que int 3 peut être placé n'importe où dans le segment de code? – smwikipedia

+1

@smwikipedia * imm8' signifie * 8 bits immédiatement *, donc par exemple 'CD 21' est' int 21h', 'CD 67' est' int 67h'. Désolé, n'a pas clarifié cela. En ce qui concerne 'int 3', je peux répondre en citant Intel:" * Ce formulaire à un octet est précieux car il peut être utilisé pour remplacer le premier octet d'une instruction par un point d'arrêt , ** y compris les autres instructions à un octet **, sans écraser d'autres codes * ". Ce qui est peut-être mal exprimé dans ma réponse. –