Changes between Version 48 and Version 49 of Doc-MIPS-Archi-Asm-kernel


Ignore:
Timestamp:
Nov 13, 2020, 6:56:11 PM (5 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Doc-MIPS-Archi-Asm-kernel

    v48 v49  
    140140<tr>
    141141<td align=center style="width:90px"><b>0</td>
    142 <td align=center> <font>mfc0</font></td>
    143 <td align=center> <font>mtc0</font></td>
     142<td align=center> <tt>mfc0</tt></td>
     143<td align=center> <tt>mtc0</tt></td>
    144144</tr>
    145145<tr>
    146146<tr>
    147147<td align=center style="width:90px"><b>1</td>
    148 <td align=center COLSPAN="2"> <font>eret</font></td>
     148<td align=center COLSPAN="2"> <tt>eret</tt></td>
    149149</tr>
    150150<tr></table>
     
    154154
    155155 || **instruction**  || ||  **comportement** || || **commentaire** ||
    156  ||**mtc0 RT, RD**   || ||`C0_RD` ← `RT`   || ||Recopie le contenu du registre GPR n°**RT**\\dans le registre du coprocesseur 0 n°**RD** ||
    157  ||**mfc0 RT, RD**   || ||`RT` ← `C0_RD`   || ||Recopie le contenu du registre du coprocesseur 0 n°**RD**\\dans le registre GPR n°**RT**||
     156 ||`mtc0 RT, RD`   || ||`C0_RD` ← `RT`   || ||Recopie le contenu du registre GPR n°**RT**\\dans le registre du coprocesseur 0 n°**RD** ||
     157 ||`mfc0 RT, RD`   || ||`RT` ← `C0_RD`   || ||Recopie le contenu du registre du coprocesseur 0 n°**RD**\\dans le registre GPR n°**RT**||
    158158
    159159 **Par exemple:**\\
    160  `mtc0 $5, $14` : `OPCOD` = `010000"`, le bit `INS 25` est à `0` et le bit `INS 23` est à `1`.\\
     160 `mtc0 $5, $14` est codé avec `0x40857000` \\\\
     161 En effet : `OPCOD` = `010000"`, le bit `INS 25` est à `0` et le bit `INS 23` est à `1`, donc :\\
    161162 — `mtc0 $5, $14` = `0b``010000`|`0.1..`| `$5` | `$14`|`.....`|`......` \\
    162163 — `mtc0 $5, $14` = `0b``010000`|`0.1..`|`00101`|`01110`|`.....`|`......` \\
     
    200201 CPU::  Coprocesseur inaccessible : tentative d'exécution d'une instruction privilégiée (`mtc0`, `mfc0`, `eret`) alors que le processeur est en mode utilisateur.
    201202
    202 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 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:
    203 
    204  - sauvegarder `PC` (l'adresse de l'instruction fautive) dans le registre `c0_epc` ;
    205  - passer en mode système et masquer les interruptions dans `c0_sr` ;
    206  - sauvegarder éventuellement l’adresse fautive dans `c0_bar`
    207  - écrire le type de l'exception dans le registre `c0_cause`;
    208  - brancher à l'adresse `0x80000180`.
     203Dans 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:
     204
     205 - sauvegarder le registre `PC` (l'adresse de l'instruction fautive) dans le registre `C0_EPC` ;
     206 - passer en mode ''kernel'' et masquer les interruptions en mettant `1` dans le bit EXL de `C0_SR` ;
     207 - sauvegarder éventuellement l’adresse fautive dans `C0_BAR` ;
     208 - écrire le type de l'exception dans le registre `C0_CAUSE` ;
     209 - se brancher à l'adresse `0x80000180`.
    209210
    210211
     
    212213
    213214
    214 Les requêtes d'interruption matérielles sont des évènements asynchrones provenant des contrôleurs de périphériques. Elles peuvent être masquées (ignorées) par le processeur. Le processeur MIPS32 possède 6 lignes d'interruptions externes qui peuvent être masquées globalement ou individuellement. L'activation d'une de ces lignes est une requête d'interruption. Elles sont notifiées dans le registre `c0_cause` et, si elles ne sont pas masquées, elles sont prises en compte à la fin de l'exécution de l'instruction en cours. Cette requête doit être maintenue active par le contrôleur de périphérique tant qu'elle n'a pas été prise en compte par le processeur.
     215Dans un ordinateur, nous avons vu qu'il y a au moins un processeur, une mémoire et des contrôleurs de périphériques. Les périphériques permettent par exemple de communiquer avec le monde extérieur.
     216Les périphériques reçoivent des commandes dans leur registres par des instructions de lecture et d'écriture venant du processeur.
     217
     218Lorsqu'ils ont terminées une commande ou lorsqu'ils ont reçus ou calculés des données, ils peuvent prévenir
     219envoyer des requêtes d'interruption par des lignes d'interruption qui les relie au processeur.
     220Une ligne d'interruption est un fil électrique qui peut prendre deux états : actif ou inactif, on dit aussi levé ou baissé.
     221
     222Les requêtes d'interruption matérielles sont des évènements asynchrones provenant des contrôleurs de périphériques. Ces évènements sont toujours attendus par le noyau du système d'exploitation. Ce sont des notifications de fins de commandes, ou d'arrivée de données sur un canal d'entrée, ou des tick d'horloge.
     223
     224Le 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.
     225
     226Les lignes d'interruption peuvent être actives ou inactives (on dit aussi levées ou baissées). L'activation d'une de ces lignes est une requête d'interruption provenant d'un contrôleur de périphérique.
     227
     228Si elles ne sont pas masquées alors elles sont prises en compte à la fin de l'exécution de l'instruction en cours. Une requête émise par un contrôleur de périphérique doit être maintenue active par le contrôleur tant qu'elle n'a pas été prise en compte par le noyau du système d'exploitation.
    215229
    216230Le 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 :