Comment le processeur gère cas de division par zéro

curieux ce que le processeur/CPU fait en général ou disons, sur intel cpu & Linux, quand il exécute une division par l'instruction zéro. Aussi comment l'erreur est relayée à l'application, de sorte qu'il peut enregistrer l'erreur ou notifier le développeur?

Merci!

6
demandé sur Alfred 2014-05-27 02:20:03

2 réponses

pour répondre en termes généraux, plutôt que d'entrer dans les détails sanglants pour Linux sur x86_64, qui sont susceptibles d'obscurcir les concepts.

CPUs ont tendance à lancer une interruption d'exception, sur des choses comme la division par zéro, ou déréférencement un pointeur nul. Ces interruptions sont bloquées, comme lorsque le matériel interrompt, interrompant l'exécution du programme courant et renvoyant le contrôle à L'OS, qui gère alors l'événement. Bien que les actions soient très dépendantes de l'environnement, le programme peut être terminé, toutes les ressources libérées (mémoire, fichiers ouverts) et, en option, le noyau dumps/stack traces générés à des fins de débogage sur un système de développeurs.

un runtime pourrait être en mesure de configurer les choses de sorte qu'un gestionnaire d'exception est appelé, peut-être un langage de script veut-il attraper la division entière par 0, ou le débordement d'entier et ensuite jeter une exception de langage de programmation ou générer des diagnostics pour aider le programmeur à comprendre où et pourquoi, il est arrivé. La levée d'un signal, qui peut être capté par l'application et manipulé, ou conduire à la fin, est une autre possibilité traditionnelle.

sur certains CPU RISC, les pièges logiciels dans OS fonctionneraient pour corriger les accès de données mal alignés, donc la lecture de la mémoire fonctionnerait, mais avec une pénalité de performance. Dans le passé, les traps étaient parfois utilisés pour émuler des instructions définies, mais qui n'étaient pas implémentées dans le matériel par un modèle CPU particulier. J'ai aussi vu des erreurs de mémoire matérielle enregistrées, comme OS initie une opération de récupération de mémoire ECC, bien que celle-ci soit traitée différemment sur x86.

appels système, en fait utiliser le même mécanisme pour sauter, d'une application d'espace utilisateur, dans le noyau OS qui gère ensuite l'événement, d'où le terme commun trap .

8
répondu Rob11311 2014-05-26 23:56:12

laissez-moi essayer de répondre à cela un peu différemment. Chaque processeur avec lequel j'ai travaillé définit une structure vectorielle d'interruption. Sur les puces Intel, cette structure s'appelle la table de répartition des interruptions (IDT). Le vecteur d'interruption est un tableau de pointeurs de fonctions. Chaque entrée dans le tableau correspond à un événement spécifique (interruption ou exception (défaut ou trappe)).

Le système d'exploitation définit les fonctions (gestionnaire d'interruption, gestionnaire d'exception) pour chaque événement. Lorsqu'il y a division par zéro, cela déclenche une exception. Le CPU répond en invoquant le gestionnaire d'exception dans le vecteur d'interruption correspondant à une division par zéro. Sur le Pentium, c'est la première entrée dans la table.

2
répondu user3344003 2014-05-27 00:49:06