223 | | Les requêtes d'interruption sont envoyées par des ''lignes d'interruption''. |
224 | | Une ''ligne d'interruption'' est un fil électrique qui relie un contrôleur de périphérique au processeur et qui peut prendre les deux états des requêtes : actif/inactif (ou levé/baissé). |
225 | | Le processeur MIPS32 possède 6 entrées de lignes d'interruptions externes qui peuvent être masquées globalement ou individuellement. Masquer une interruption signifie ne pas en tenir compte. Nous n'utiliserons qu'une seule de ces 6 entrées dans le prototype des TP. |
| 223 | Les requêtes d'interruption sont envoyées sur des ''lignes d'interruption''. |
| 224 | **Une ''ligne d'interruption'' est un fil électrique qui relie un contrôleur de périphérique au processeur** et qui peut prendre les deux états des requêtes : actif/inactif (ou levé/baissé). |
| 225 | |
| 226 | Le processeur MIPS32 possède 6 entrées de lignes d'interruptions externes qui peuvent être ''masquées'' globalement ou individuellement. Nous n'utiliserons qu'une seule de ces 6 entrées dans le prototype des TP. |
| 227 | |
| 228 | Quand le noyau décide ''masquer une interruption'', cela signifie qu'il décide ne pas tenir compte de l'état de la ligne d'interruption. Les interruptions peuvent être masquées à certains moments pendant un temps borné lorsque le noyau est en train de faire des opérations critiques qui doivent être réalisées de manière atomique (sans être interrompu). Si une ligne d'interruption s'active alors qu'elle est masquée, alors le processeur ne la verra et donc le noyau ne la traitera qu'au moment où la ligne sera démasquée. |
231 | | |
232 | | Le processeur doit alors passer alors en mode système et se brancher au noyau du système d'exploitation. Après avoir identifié que la cause est une interruption (en examinant le contenu du registre `c0_cause`), le noyau se branche au gestionnaire d’interruption qui doit appeler une fonction appropriée pour le traitement de la requête. Cette fonction est appelée routine d’interruption ou ISR (pour ''Interrupt Service Routine''). Comme il faut reprendre l'exécution de l'application en cours à la fin du traitement de l'interruption, il faut sauvegarder une adresse de retour. Lorsqu’il reçoit une requête d’interruption non masquée, le matériel doit donc : |
233 | | |
234 | | - sauvegarder PC+4 (l'adresse de retour) dans le registre `c0_epc` ; |
235 | | - passer en mode système et masquer les interruptions dans `c0_sr` ; |
236 | | - écrire qu'il s'agit d'une interruption dans le registre `c0_cause` ; |
237 | | - brancher à l'adresse `0x80000180`program. |
| 234 | Le processeur doit alors passer alors en mode système et se brancher au noyau du système d'exploitation. |
| 235 | De manière plus détaillée, lorsque le processeur détecte une exception, il réalise les opérations suivantes : |
| 236 | - sauvegarder PC+4 (l'adresse de retour) dans le registre `C0_EPC` ; |
| 237 | - passer en mode système et masquer les interruptions dans `C0_SR` ; |
| 238 | - écrire qu'il s'agit d'une interruption dans le registre `C0_CAUSE` ; |
| 239 | - brancher à l'adresse `0x80000180`. |
| 240 | |
| 241 | Après avoir identifié que la cause est une interruption (en examinant le contenu du registre `c0_cause`), le noyau se branche au gestionnaire d’interruption qui doit appeler une fonction appropriée pour le traitement de la requête. Cette fonction est appelée routine d’interruption ou ISR (pour ''Interrupt Service Routine''). Comme il faut reprendre l'exécution de l'application en cours à la fin du traitement de l'interruption, il faut sauvegarder une adresse de retour. Lorsqu’il reçoit une requête d’interruption non masquée, le matériel doit donc : |