Quelle est la différence entre BIOS, DOS et interruption en temps réel dans la perspective d'un langage d'assemblage?


Réponse 1:

C'est une grande question, à laquelle personne ne pense vraiment beaucoup de nos jours. La réponse simple est: Une «interruption en temps réel» est une qui n'est pas explicitement exécutée par du code. Il a été déclenché soit en tant que gestionnaire d'exceptions, soit en tant que périphérique externe, qui a défini la ligne d'interruption sur le processeur. Un BIOS et une interruption du système d'exploitation sont essentiellement une convention d'appel de raccourci que vous pouvez utiliser dans l'assembleur.

Lorsqu'une interruption est invoquée ou déclenchée, le segment de code, le pointeur d'instruction et le registre des indicateurs sont tous poussés dans la pile. Le numéro d'interruption est extrait du bus et une nouvelle adresse d'exécution est recherchée par le processeur dans la table des vecteurs d'interruption. Et l'exécution du code commence à cette adresse. C'est comme un appel lointain.

Pour les interruptions externes, google APIC ou PIC, qui est Advanced Programmable Interrupt Controller. Le PC d'origine est livré avec une version du contrôleur Intel 8259. Du point de vue du langage d'assemblage, votre code fonctionne très bien, puis tout à coup, à votre insu (ou tout code que vous avez immédiatement exécuté), une interruption est déclenchée. Lorsque l'interruption est terminée, tous les registres, indicateurs et la partie significative de la pile sont restaurés, et votre code ne sait même pas que cela se produit et continue de s'exécuter. Les interruptions externes peuvent également être «masquées», ce qui signifie que si l'indicateur d'interruption sur le processeur est effacé avec l'instruction CLI, alors ces interruptions externes ne se produiront que s'il s'agit d'une «interruption non masquable» (NMI). Cela est parfois important lors de l'écriture de verrous de mémoire et vous voulez vous assurer qu'aucun autre code ou thread n'interrompt ce que vous faites.

J'appellerais toujours la gestion des exceptions, une interruption en temps réel. En cela, tout comme les interruptions externes, le temps est essentiel. Mais cela s'appelle également un PIÈGE. Techniquement, l'interruption vient de l'intérieur du processeur, par un état que vous avez déclenché via le logiciel. Pensez à des choses comme diviser par zéro ou un défaut de page. Cela ne s'est pas produit DIRECTEMENT grâce au code que vous avez écrit, mais indirectement. Et de même doit être traité immédiatement. Dans ce cas, l'interruption PEUT ajuster une valeur ou changer un indicateur, mais généralement avec l'intention de corriger l'erreur, de continuer l'exécution ou d'aviser le programme que l'exécution ne peut pas continuer, et le programme peut avoir besoin de se terminer immédiatement. Ces exceptions reviennent à l'instruction même qui a provoqué la panne. Vous ne pouvez pas masquer ces interruptions.

Les interruptions du BIOS ou du système d'exploitation sont également appelées TRAP, mais elles sont explicitement appelées. Ils ne sont pas en temps réel. Ils peuvent ne pas revenir tout de suite. Ils peuvent continuer à exécuter jusqu'à ce qu'ils terminent leur tâche. Dans votre code, vous placez un INT 3 par exemple (Trigger Debugger), et votre code peut ne pas s'exécuter pendant des minutes plus tard. Les interruptions du BIOS sont clairement dans le BIOS et les interruptions du système d'exploitation remplacent fréquemment les interruptions du BIOS par les leurs. Et souvent (mais moins dans les systèmes d'exploitation protégés), même une application définit ses propres interruptions. Du point de vue de la programmation, vous ne faites qu'appeler du code et vous vous attendez à ce que les registres soient modifiés et qu'un certain temps s'écoule. Et souvent, la valeur de retour est transmise dans les registres.

Et contrairement à un appel, lorsqu'une interruption est finalement terminée, elle doit être nettoyée après elle-même, et l'instruction IRET récupérera le segment de code, le pointeur d'instruction et les indicateurs de la pile d'application et reprendra son exécution à ce point.


Réponse 2:

Toutes les interruptions ont un point commun: comment elles sont gérées. Lorsqu'elles se produisent, le CPU interrompt la séquence d'instructions actuelle, enregistre son état sur la pile de la machine et exécute la routine d'interruption établie par le système d'exploitation. Ensuite, il peut restaurer l'état de la pile et continuer avec le code qui a été interrompu, ou il peut abandonner le programme, etc. Laquelle des 256 routines d'interruption possibles est invoquée, dépend de l'événement qui a provoqué l'interruption: l'interruption en temps réel (asynchrone) est déclenchée par un événement extérieur: clavier enfoncé, souris déplacée, horloge cochée. Le périphérique matériel envoie une demande d'interruption à la puce APIC qui attend jusqu'à ce que le CPU ait terminé l'instruction en cours, puis l'APIC ordonne au CPU de sauvegarder son état et d'effectuer l'action nécessaire: stocker le caractère pressé dans le tampon du clavier, déplacer le curseur de la souris sur l'écran, mettre à jour l'ordinateur L'interruption synchrone (exception) est le plus souvent causée par une erreur du programmeur, telle que la division par zéro, la lecture de la mémoire à partir d'une adresse inexistante, la tentative d'exécution d'une instruction non valide. La routine d'interruption signale un message d'erreur dans ce cas. Une interruption appelable (demande de service OS) est invoquée par le programmeur d'assemblage (ou le compilateur) avec l'instruction machine INT. Leurs routines sont câblées dans le BIOS ou établies lorsque le système d'exploitation est chargé. C'est le seul type sur interruption qui concerne le programmeur d'assemblage (sauf s'ils écrivent le système d'exploitation ou le firmware du BIOS). Les 256 interruptions sont documentées ici: Interrupt Jump Table


Réponse 3:

Toutes les interruptions ont un point commun: comment elles sont gérées. Lorsqu'elles se produisent, le CPU interrompt la séquence d'instructions actuelle, enregistre son état sur la pile de la machine et exécute la routine d'interruption établie par le système d'exploitation. Ensuite, il peut restaurer l'état de la pile et continuer avec le code qui a été interrompu, ou il peut abandonner le programme, etc. Laquelle des 256 routines d'interruption possibles est invoquée, dépend de l'événement qui a provoqué l'interruption: l'interruption en temps réel (asynchrone) est déclenchée par un événement extérieur: clavier enfoncé, souris déplacée, horloge cochée. Le périphérique matériel envoie une demande d'interruption à la puce APIC qui attend jusqu'à ce que le CPU ait terminé l'instruction en cours, puis l'APIC ordonne au CPU de sauvegarder son état et d'effectuer l'action nécessaire: stocker le caractère pressé dans le tampon du clavier, déplacer le curseur de la souris sur l'écran, mettre à jour l'ordinateur L'interruption synchrone (exception) est le plus souvent causée par une erreur du programmeur, telle que la division par zéro, la lecture de la mémoire à partir d'une adresse inexistante, la tentative d'exécution d'une instruction non valide. La routine d'interruption signale un message d'erreur dans ce cas. Une interruption appelable (demande de service OS) est invoquée par le programmeur d'assemblage (ou le compilateur) avec l'instruction machine INT. Leurs routines sont câblées dans le BIOS ou établies lorsque le système d'exploitation est chargé. C'est le seul type sur interruption qui concerne le programmeur d'assemblage (sauf s'ils écrivent le système d'exploitation ou le firmware du BIOS). Les 256 interruptions sont documentées ici: Interrupt Jump Table