158 | | Quand le processeur est en mode système, les 2 segments sont accessibles. Quand le processeur est en mode utilisateur, seul le segment utilisateur est accessible. Le processeur part en exception si une instruction essaie d'accéder à la mémoire avec une adresse correspondant au segment système alors que le processeur est en mode utilisateur. |
159 | | |
160 | | Si une anomalie est détectée au cours du transfert entre le processeur et la mémoire, le système mémoire peut le signaler au moyen d'un signal d'erreur, qui déclenche un départ en exception. |
| 158 | Quand le processeur est en mode système, les 2 parties sont accessibles. Quand le processeur est en mode utilisateur, seul la partie utilisateur est accessible. |
| 159 | |
| 160 | Le processeur part en exception (le programme est dérouté vers le noyau du système d'exploitation) si une instruction essaie d'accéder à la mémoire avec une adresse de la partie système alors que le processeur est en mode utilisateur. |
| 161 | |
| 162 | Si une anomalie est détectée au cours du transfert entre le processeur et la mémoire, le système mémoire le signale ce qui déclenche également un départ en exception. |
541 | | Toutes les instructions de branchement conditionnel sont relatives au compteur ordinal pour que le code soit translatable. L'adresse de saut est le résultat d'une addition entre la valeur du compteur ordinal et un déplacement signé. |
542 | | |
543 | | Les instructions MTC0 et MFC0 permettent de transférer le contenu des registres SR, CR, EPC et BAR vers un registre général et inversement. Ces 2 instructions ne peuvent être exécutées qu’en mode système, de même que l'instruction ERET qui permet de restaurer l'état antérieur du registre d'état avant de sortir du gestionnaire d'exceptions. |
| 554 | Toutes les instructions de branchement conditionnel sont relatives au PC (compteur ordinal) pour que le code soit translatable (déplaçable ailleur en mémoire), c'est-à-dire que l'adresse de branchement est le résultat de l'addition entre la valeur du compteur ordinal et un déplacement signé. |
| 555 | |
| 556 | Les instructions `mtc0` et `mfc0` permettent de transférer le contenu des registres `c0_sr`, `c0_cause`, `c0_epc` etc. vers un registre général GPR et inversement. Ces 2 instructions ne peuvent être exécutées qu’en mode système, de même que l'instruction `eret` qui permet de restaurer l'état antérieur du registre d'état `c0_ sr` avant de sortir du gestionnaire d'exceptions. |
563 | | Les exceptions sont des évènements "anormaux", le plus souvent liés à une erreur de programmation, qui empêche l'exécution correcte de l'instruction en cours. La détection d'une exception entraîne l'arrêt immédiat de l'exécution de l'instruction fautive. Ainsi, on assure que l'instruction fautive ne modifie pas la valeur d'un registre visible ou de la mémoire. Les exceptions ne sont évidemment pas masquables. Il y a 7 types d'exception dans cette version du processeur MIPS32 : |
564 | | |
565 | | ADEL:: Adresse illégale en lecture : adresse non alignée ou se trouvant dans le segment système alors que le processeur est en mode utilisateur. |
566 | | ADES:: Adresse illégale en écriture : adresse non alignée ou accès à une donnée dans le segment système alors que le processeur est en mode utilisateur. |
567 | | DBE:: Data bus erreur : le système mémoire signale une erreur en activant le signal BERR à la suite d'un accès de donnée. |
568 | | IBE:: Instruction bus erreur : le système mémoire signale une erreur en activant le signal BERR à l'occasion d'une lecture instruction. |
569 | | OVF:: Dépassement de capacité : lors de l'exécution d'une instruction arithmétique (ADD, ADDI ou SUB), le résultat ne peut être représenté sur 32 bits. |
570 | | RI:: OPCOD illégal : l'OPCOD ne correspond à aucune instruction connue (il s'agit probablement d'un branchement dans une zone mémoire ne contenant pas du code exécutable. |
571 | | CPU:: Coprocesseur inaccessible : tentative d'exécution d'une instruction privilégiée (MTC0, MFC0, ERET) alors que le processeur est en mode utilisateur. |
572 | | |
573 | | Le processeur doit alors passer en mode système, et se brancher au Gestionnaire d'Interruptions, Exceptions et Trappes (GIET), implanté conventionnellement à l'adresse "0x80000180". Après avoir identifié que la cause est une exception (en examinant le contenu du registre CR), le GIET se branche alors au gestionnaire d’exception. Toutes les exceptions étant fatales il n'est pas nécessaire de sauvegarder une adresse de retour, car il n'y a pas de reprise de l'exécution du programme contenant l'instruction fautive. Le processeur doit cependant transmettre au gestionnaire d'exceptions l'adresse de l'instruction fautive et indiquer dans le registre de cause le type d'exception détectée. Lorsqu’il détecte une exception, le matériel doit donc: |
574 | | |
575 | | - sauvegarder PC (l'adresse de l'instruction fautive) dans le registre EPC |
576 | | - passer en mode système et masque les interruptions dans SR |
577 | | - sauvegarder éventuellement l’adresse fautive dans BAR |
578 | | - écrire le type de l'exception dans le registre CR |
579 | | - brancher à l'adresse "0x80000180". |
| 578 | Les exceptions sont des évènements "anormaux" détectés au moment de l'exécution des instructions. Ils sont le plus souvent liés à une erreur de programmation qui empêche l'exécution correcte de l'instruction en cours. La détection d'une exception entraîne l'arrêt immédiat de l'exécution de l'instruction fautive. Ainsi, on assure que l'instruction fautive ne modifie pas la valeur d'un registre visible ou de la mémoire. Les exceptions ne sont évidemment pas masquables, cela signifie que l'on ne peut pas interdire leur gestion. Il y a 7 types d'exception dans cette version du processeur MIPS32 : |
| 579 | |
| 580 | ADEL:: Adresse illégale en lecture : adresse non alignée ou se trouvant dans la partie système alors que le processeur est en mode utilisateur. |
| 581 | |
| 582 | ADES:: Adresse illégale en écriture : adresse non alignée ou accès à une donnée dans le partie système alors que le processeur est en mode utilisateur. |
| 583 | |
| 584 | DBE:: Data bus erreur : le système mémoire signale une erreur en activant le signal BERR à la suite d'un accès de donnée à une adresse qui n'a pas de case mémoire associée. On dit qu'elle n'est pas ''mappée''. Cette erreur est aussi nommée erreur de segmentation ('segmentation fault` en anglais). |
| 585 | |
| 586 | IBE:: Instruction bus erreur : le système mémoire signale une erreur en activant le signal BERR à l'occasion d'une lecture instruction. C'est le même problème que pour **DBE** mais cela concerne les instructions. |
| 587 | |
| 588 | OVF:: Dépassement de capacité : lors de l'exécution d'une instruction arithmétique (ADD ou ADDI), le résultat ne peut être représenté sur 32 bits. Par exemple, la somme de 2 nombres positifs donne un nombre négatif. |
| 589 | |
| 590 | RI:: OPCOD illégal : l'OPCOD ne correspond à aucune instruction connue, il s'agit probablement d'un branchement dans une zone mémoire ne contenant pas du code exécutable. |
| 591 | |
| 592 | CPU:: Coprocesseur inaccessible : tentative d'exécution d'une instruction privilégiée (`mtc0`, `mfc0`, `eret`) alors que le processeur est en mode utilisateur. |
| 593 | |
| 594 | Dans tous les cas, le processeur doit passer en mode système et se brancher au noyau du système d'exploitation implanté à l'adresse `0x80000180`. Après avoir identifié que la cause est une exception (en examinant le contenu du registre `c0_cause`), le noyau se branche alors au gestionnaire d’exception. Ici, toutes les exceptions sont fatales, il n'y a pas de reprise de l'exécution du programme contenant l'instruction fautive. Le processeur doit cependant transmettre au gestionnaire d'exceptions l'adresse de l'instruction fautive et indiquer dans le registre de cause le type d'exception détectée. Lorsqu’il détecte une exception, le matériel doit donc: |
| 595 | |
| 596 | - sauvegarder `PC` (l'adresse de l'instruction fautive) dans le registre `c0_epc` ; |
| 597 | - passer en mode système et masquer les interruptions dans `c0_sr` ; |
| 598 | - sauvegarder éventuellement l’adresse fautive dans `c0_bar`; |
| 599 | - écrire le type de l'exception dans le registre `c0_cause`; |
| 600 | - brancher à l'adresse `0x80000180`. |
| 601 | |
| 602 | |