185 | | 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 : |
186 | | |
187 | | 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. |
188 | | |
189 | | 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. |
190 | | |
191 | | 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). |
192 | | |
193 | | 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. |
194 | | |
195 | | 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. |
196 | | |
197 | | 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. |
198 | | |
199 | | CPU:: Coprocesseur inaccessible : tentative d'exécution d'une instruction privilégiée (`mtc0`, `mfc0`, `eret`) alors que le processeur est en mode utilisateur. |
200 | | |
201 | | Dans tous les cas, le processeur doit passer en mode ''kernel'' 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 de l'application 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: |
202 | | |
203 | | - sauvegarder le registre `PC` (l'adresse de l'instruction fautive) dans le registre `C0_EPC` ; |
204 | | - passer en mode ''kernel'' et masquer les interruptions en mettant `1` dans le bit EXL de `C0_SR` ; |
205 | | - sauvegarder éventuellement l’adresse fautive dans `C0_BAR` ; |
206 | | - écrire le type de l'exception dans le registre `C0_CAUSE` ; |
207 | | - se brancher à l'adresse `0x80000180`. |
| 186 | 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, afin que l'instruction fautive ne modifie pas la valeur d'un registre visible ou 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 : |
| 187 | |
| 188 | ADEL:: Adresse illégale en lecture : adresse non alignée (comme un `lw` à une adresse non multiple de 4) ou alors une adresse se trouvant dans la partie ''kernel'' alors que le processeur est en mode ''user''. |
| 189 | |
| 190 | ADES:: Adresse illégale en écriture : adresse non alignée (comme un `sw` à une adresse non multiple de 4) ou alors un accès à une donnée dans la partie ''kernel'' alors que le processeur est en mode ''user''. |
| 191 | |
| 192 | DBE:: Data Bus Error : le système mémoire signale une erreur en activant le signal `BERR` (Bus ERRor) à 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). |
| 193 | |
| 194 | IBE:: Instruction Bus Error : 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. |
| 195 | |
| 196 | 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. |
| 197 | |
| 198 | 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. |
| 199 | |
| 200 | CPU:: Coprocesseur inaccessible : tentative d'exécution d'une instruction privilégiée (`mtc0`, `mfc0`, `eret`) alors que le processeur est en mode ''user''. |
| 201 | |
| 202 | Dans tous les cas, le processeur doit passer en mode ''kernel'' et se brancher au noyau du système d'exploitation implanté à l'adresse `0x80000180`. |
| 203 | Lorsque le processeur détecte une exception, il réalise les opérations suivantes : |
| 204 | - sauvegarde du registre `PC` (l'adresse de l'instruction fautive) dans le registre `C0_EPC` ; |
| 205 | - passage en mode ''kernel'' et masquage les interruptions en mettant `1` dans le bit EXL de `C0_SR` ; |
| 206 | - sauvegarde éventuelle de l’adresse fautive dans `C0_BAR` ; |
| 207 | - écriture du type de l'exception dans le registre `C0_CAUSE` ; |
| 208 | - branchement à l'adresse `0x80000180`. |
| 209 | |
| 210 | 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 de l'application contenant l'instruction fautive. |
| 211 | 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. |
| 212 | |
| 213 | |