Quelqu'un peut-il m'expliquer s'il vous plaît ce qui se passe à l'intérieur d'une routine de service d'interruption (bien que cela dépend d'une routine spécifique, une explication générale suffit)? Cela a toujours été une boîte noire pour moi.
Il y a une bonne page wikipedia sur interrupt handlers .
"Un gestionnaire d'interruption, également appelé routine de service d'interruption (ISR), est un sous-programme de rappel dans un système d'exploitation ou un pilote de périphérique dont l'exécution est déclenchée par la réception d'une interruption. Les gestionnaires d'interruption ont une multitude de fonctions qui varient en fonction la raison pour laquelle l'interruption a été générée et la vitesse à laquelle le gestionnaire d'interruptions termine sa tâche. "
Fondamentalement, lorsqu'un composant matériel (une interruption matérielle) ou une tâche du système d'exploitation (interruption logicielle) doit être exécuté, il déclenche une interruption. Si ces interruptions ne sont pas masquées (ignorées), le système d'exploitation arrête ce qu'il fait et appelle un code spécial pour gérer ce nouvel événement.
Un bon exemple est la lecture d’un disque dur. Le lecteur est lent et vous ne voulez pas que votre système d'exploitation attende le retour des données; vous voulez que le système d'exploitation aille faire autre chose. Vous configurez donc le système de sorte que, lorsque le disque contient les données demandées, il déclenche une interruption. Dans la routine de service d'interruption pour le disque, la CPU prendra les données qui sont maintenant prêtes et les renverra au demandeur.
Les ISR doivent souvent être rapides car le matériel peut avoir un tampon limité, qui sera écrasé par de nouvelles données s'il est maintenant extrait assez rapidement. Il est également important que votre ISR soit complet rapidement car pendant que le processeur est en service, les autres interruptions seront masquées, ce qui signifie que si le processeur ne peut pas les accéder rapidement, il est possible de perdre suffisamment de données.
Exemple minimal 16 bits
La meilleure façon de comprendre est de faire vous-même quelques exemples minimaux.
Commencez par apprendre à créer un système d’exploitation de chargeur de démarrage minimal et à l’exécuter sur QEMU et sur du matériel réel, comme je l’ai expliqué ici: https://stackoverflow.com/a/32483545/895245
Maintenant, vous pouvez exécuter en mode réel 16 bits:
movw $handler0, 0x00
mov %cs, 0x02
movw $handler1, 0x04
mov %cs, 0x06
int $0
int $1
hlt
handler0:
/* Do 0. */
iret
handler1:
/* Do 1. */
iret
Cela ferait dans l'ordre:
Do 0.
Do 1.
hlt
: arrêter l'exécutionNotez comment le processeur recherche le premier gestionnaire à l'adresse 0
et le second à 4
: il s'agit d'une table de gestionnaires appelée IVT , et chaque entrée comporte 4 octets.
Exemple minimal faisant IO pour rendre les gestionnaires visibles.
Mode protégé
Les systèmes d'exploitation modernes fonctionnent en mode dit protégé.
La manipulation a plus d'options dans ce mode, donc c'est plus complexe, mais l'esprit est le même.
Voir également
Question connexe: Que signifie "int 0x80" dans le code d'assemblage?
Pendant que le 8086 exécute un programme, une interruption interrompt la séquence normale d'exécution de l'instruction, déviez-la vers un autre programme appelé programme d'interruption de service (ISR). après exécution, control retourne à nouveau le programme principal.
Une interruption est utilisée pour provoquer un arrêt temporaire de l'exécution du programme. Le microprocesseur répond à la routine de service d'interruption, qui est un programme ou sous-programme court qui indique au microprocesseur comment gérer l'interruption.