610 | | 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 du programme 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 : |
611 | | |
612 | | - sauvegarder PC+4 (l'adresse de retour) dans le registre EPC |
613 | | - passer en mode système et masque les interruptions dans SR |
614 | | - écrire qu'il s'agit d'une interruption dans le registre CR |
615 | | - brancher à l'adresse "0x80000180". |
616 | | |
617 | | En plus des 6 lignes d'interruption matérielles, le processeur MIPS32 possède un mécanisme d'interruption logicielle: Il existe 2 bits dans le registre de cause CR qui peuvent être écrits par le logiciel au moyen de l'instruction privilégiée MTC0. La mise à 1 de ces bits déclenche le même traitement que les requêtes d'interruptions externes, s'ils ne sont pas masqués. |
| 610 | 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 : |
| 611 | |
| 612 | - sauvegarder PC+4 (l'adresse de retour) dans le registre `c0_epc` ; |
| 613 | - passer en mode système et masquer les interruptions dans `c0_sr` ; |
| 614 | - écrire qu'il s'agit d'une interruption dans le registre `c0_cause` ; |
| 615 | - brancher à l'adresse `0x80000180`program. |
| 616 | |
| 617 | En plus des 6 lignes d'interruption matérielles, le processeur MIPS32 possède un mécanisme d'interruption logicielle: Il existe 2 bits dans le registre de cause `c0_cause` qui peuvent être écrits par le logiciel au moyen de l'instruction privilégiée `mtc0`. La mise à 1 de ces bits déclenche le même traitement que les requêtes d'interruptions externes, s'ils ne sont pas masqués. |
624 | | L'instruction SYSCALL permet à une tâche (utilisateur ou système) de demander un service au système d'exploitation, comme par exemple effectuer une entrée-sortie. Le code définissant le type de service demandé au système, et un éventuel paramètre doivent avoir été préalablement rangés dans des registres généraux. L'instruction BREAK est utilisée plus spécifiquement pour poser un point d'arrêt (dans un but de déverminage du logiciel): on remplace brutalement une instruction du programme à déverminer par l'instruction BREAK. Dans les deux cas, le processeur passe en mode système et se branche ici encore au GIET. Après avoir identifié que la cause est un appel système (en examinant le contenu du registre CR), le GIET se branche au gestionnaire d’appels système. Lorsqu’il rencontre une des deux instructions SYSCALL ou BREAK, le matériel effectue les opérations suivantes : |
625 | | |
626 | | - sauvegarder PC (l'adresse de l'instruction) dans le registre EPC (l’adresse de retour est PC + 4) |
627 | | - passer en mode système et masquage des interruptions dans SR |
628 | | - écrire la cause du déroutement dans le registre CR |
629 | | - brancher à l'adresse "0x80000180". |
630 | | |
631 | | |
632 | | |
633 | | === 4) Signal RESET |
634 | | |
635 | | |
636 | | Le processeur possède également une entrée RESET dont l'activation, pendant au moins un cycle, entraîne le branchement inconditionnel au logiciel bootloader. Ce logiciel, implanté conventionnellement à l’adresse 0xBFC00000 doit principalement charger le code du système d’exploitation dans la mémoire et initialiser les périphériques. Cette requête est très semblable à une septième ligne d'interruption externe avec les différences importantes suivantes : |
637 | | |
638 | | - elle n'est pas masquable. |
| 624 | L'instruction `syscall` permet à une application de l'utilisateur de demander un service au noyau du système d'exploitation, comme par exemple effectuer une entrée-sortie. Le code définissant le type de service demandé au système, et d'éventuels paramètres doivent avoir été préalablement rangés dans des registres généraux. L'instruction `break` est utilisée plus spécifiquement pour poser un point d'arrêt (dans un but de debuggage du logiciel): on remplace brutalement une instruction du programme à debugger par l'instruction `break`. Dans les deux cas, le processeur passe en mode système et se branche ici encore au noyau. Après avoir identifié que la cause est un appel système (en examinant le contenu du registre `c0_cause`), le noyau se branche au gestionnaire d’appels système. Lorsqu’il rencontre une des deux instructions `syscall` ou `break`, le matériel effectue les opérations suivantes : |
| 625 | |
| 626 | - sauvegarder PC (l'adresse de l'instruction) dans le registre `c0_epc` (l’adresse de retour est PC + 4) ; |
| 627 | - passer en mode système et masquage des interruptions dans `c0_sr` ; |
| 628 | - écrire la cause du déroutement dans le registre `c0_cause` ; |
| 629 | - brancher à l'adresse `0x80000180`. |
| 630 | |
| 631 | |
| 632 | |
| 633 | === 4) Signal `RESET` |
| 634 | |
| 635 | |
| 636 | Le processeur possède également une entrée `RESET` dont l'activation pendant au moins un cycle entraîne le branchement inconditionnel du code de démarrage de l'ordinateur (code de boot). Ce code, implanté à l’adresse `0xBFC00000` doit principalement charger le code du noyau du système d’exploitation dans la mémoire depuis le disque ou le réseau et se brancher à la fonction d'initialisation du noyau. Cette fonction initialise les contrôleurs de périphériques et les structures internes du noyau et, à la fin elle se branche à la première application utilisateur. Dans notre modèle d'ordinateur, le noyau est pré-chargé en mémoire et le code de boot se contente d'appeler la fonction d'initialisation. |
| 637 | |
| 638 | Cette requête est très semblable à une septième ligne d'interruption externe avec les différences importantes suivantes: |
| 639 | |
| 640 | - elle n'est pas masquable : |
649 | | === 5) Sortie du GIET ou du bootloader |
650 | | |
651 | | |
652 | | Avant de reprendre l'exécution d'un programme qui a effectué un appel système (instructions SYSCALL ou BREAK) ou qui a été interrompu par une interruption, ou pour sortir du bootloader, il est nécessaire d'exécuter l'instruction ERET. |
653 | | Cette instruction modifie le contenu du registre SR, et effectue un branchement à l’adresse contenue dans le registre EPC. |
654 | | |
655 | | |
656 | | |
657 | | === 6) Gestion du registre d'état SR |
658 | | |
659 | | |
660 | | Le registre SR contient le mode d'exécution du processeur. Cela concerne son comportement vis-à-vis des signauc d'interruptions, c'est-à-dire les masques, et s'il est en mode ''kernel'' ou en mode ''user'' |
661 | | - La figure suivante présente le contenu des 16 bits de poids faible du registre SR. Cette version du MIP32 n’utilise que 12 bits: |
| 651 | === 5) Sortie du noyau |
| 652 | |
| 653 | |
| 654 | Avant de reprendre l'exécution de l'application qui a effectué un appel système (instructions `syscall`) ou qui a été interrompu par une interruption, il est nécessaire d'exécuter l'instruction `eret`. |
| 655 | Cette instruction modifie le contenu du registre `c0_sr`, et effectue un branchement à l’adresse contenue dans le registre `c0_epc`. |
| 656 | |
| 657 | |
| 658 | |
| 659 | === 6) Gestion du registre d'état `c0_sr` |
| 660 | |
| 661 | |
| 662 | Le registre `c0_sr` contient l'état du processeur. Cela concerne son comportement vis-à-vis des requêtes d'interruptions, c'est-à-dire les masques des interruptions matérielles et logicielles, et le mode d'exécution, mode système (''kernel'') ou en mode utilisateur (''user''). |
| 663 | |
| 664 | - La figure suivante présente le contenu des 16 bits de poids faible du registre `c0_sr`. Cette version du MIPS32 n’utilise que 12 bits: |
693 | | ||**IE **||Interrupt Enable || |
694 | | ||**EXL **||Exception Level || |
695 | | ||**ERL **||Reset Level || |
696 | | ||**UM **||User Mode || |
697 | | ||**IM![7:0] **||Masques individuels pour les six lignes d’interruption matérielles (bits IM![7:2])\\et pour les 2 interruptions logicielles (bits IM![1:0]) |
698 | | |
699 | | - Le processeur a le droit d’accéder aux ressources protégées (registres du CP0, |
700 | | et adresses mémoires > 0x7FFFFFFF) si et seulement si le bit UM vaut 0, |
701 | | ou si l’un des deux bits ERL et EXL vaut 1. |
702 | | - Les interruptions sont autorisées si et seulement si le bit IE vaut 1, |
703 | | et si les deux bits ERL et EXL valent 00, et si le bit correspondant de IM vaut 1. |
704 | | - Les trois types d’évènements qui déclenchent le branchement au GIET |
705 | | (interruptions, exceptions et appels système) forcent le bit EXL à 1, |
706 | | ce qui masque les interruptions et autorise l’accès aux ressources protégées. |
707 | | - L’activation du signal RESET qui force le branchement au Boot-Loader force le bit ERL à 1, |
708 | | ce qui masque les interruptions et autorise l’accès aux ressources protégées. |
709 | | - L’instruction ERET force le bit EXL à 0. |
| 696 | ||**IE **||Interrupt Enable ||0 = toutes les interruptions sont masquées\\1 = interruptions non-masquées mais elles peuvent l'être avec IM[7:0]|| |
| 697 | ||**EXL **||Exception Level ||0 = aucun effet sur le processeur\\1 = le processeur vient d'entrer dans le noyau et donc le processeur est en mode ''kernel'' interruptions massquées|| |
| 698 | ||**ERL **||Error Level ||1 = une exception est survennue quand EXL == 1, c'est une erreur fatale || |
| 699 | ||**UM **||User Mode ||0 = mode d'exécution ''kernel''\\1 = mode d'exécution ''user''|| |
| 700 | ||**IM![7:0] **||Masques individuels || pour les six lignes d’interruption matérielles (bits IM![7:2])\\et pour les 2 interruptions logicielles (bits IM![1:0]) |
| 701 | |
| 702 | - Quelques remarques |
| 703 | - Le processeur a le droit d’accéder aux ressources protégées (registres du coprocessor 0(`c0`), |
| 704 | et aux adresses mémoires >= `0x80000000) si et seulement si le bit UM vaut 0, |
| 705 | ou si l’un des deux bits ERL et EXL vaut 1. |
| 706 | - Les interruptions sont autorisées si et seulement si le bit IE vaut 1, |
| 707 | et si les deux bits ERL et EXL valent 00, et si le bit correspondant de IM vaut 1. |
| 708 | - Les trois types d’évènements qui déclenchent le branchement au GIET |
| 709 | (interruptions, exceptions et appels système) forcent le bit EXL à 1, |
| 710 | ce qui masque les interruptions et autorise l’accès aux ressources protégées. |
| 711 | - L’activation du signal RESET qui force le branchement au Boot-Loader force le bit ERL à 1, |
| 712 | ce qui masque les interruptions et autorise l’accès aux ressources protégées. |
| 713 | - L’instruction ERET force le bit EXL à 0. |