114 | | |
115 | | |
116 | | |
117 | | == C) ADRESSAGE MÉMOIRE |
| 114 | Comportement des instructions `mtc0`et `mfc0`:: |
| 115 | |
| 116 | || instruction assembleur || ||comportement dans le processeur || || Remarques || |
| 117 | ||**mtc0 $gpr, $c0** || || Copro. 0 ($C0) <--- Reg. GPR ($gpr) || || $c0 = $8, $12, $13, $14, $15 ou $16 ; $gpr = $0 .. $31 || |
| 118 | ||**mfc0 $gpr, $c0** || || Reg. GPR ($gpr) <--- Copro. 0 ($C0) || || $c0 = $8, $12, $13, $14, $15 ou $16 ; $gpr = $0 .. $31 || |
| 119 | |
| 120 | |
| 121 | |
| 122 | |
| 123 | == C) ADRESSAGE DE LA MÉMOIRE |
123 | | L'ensemble des adresses que peut former le processeur définit son espace d'adressage. Toutes les adresses formées sont des adresses d'octets, ce qui signifie que la mémoire est vue comme un tableau d'octets, qui contient aussi bien les données que les instructions. |
124 | | |
125 | | Les adresses sont codées sur 32 bits. Les instructions sont codées sur 32 bits. Les échanges de données avec la mémoire se font par mot (4 octets consécutifs), demi-mot (2 octets consécutifs), ou par octet. Pour les transferts de mots et de demi-mots, le processeur respecte la convention "little endian". |
126 | | |
127 | | L'adresse d'un mot de donnée ou d'une instruction doit être multiple de 4. L'adresse d'un demi-mot doit être multiple de 2. (on dit que les adresses doivent être "alignées"). Le processeur part en exception si une instruction calcule une adresse qui ne respecte pas cette contrainte. |
| 129 | L'ensemble des adresses que peut former le processeur définit son espace d'adressage. Toutes les adresses formées sont des adresses d'octets, ce qui signifie que la mémoire est vue par le processeur comme un tableau d'octets qui contient aussi bien les données que les instructions. |
| 130 | |
| 131 | Les adresses sont codées sur 32 bits. Les instructions sont codées sur 32 bits. Les échanges de données avec la mémoire se font par mot (4 octets consécutifs), demi-mot (2 octets consécutifs) ou par octet. Pour les transferts de mots et de demi-mots, le processeur respecte la convention "little endian" (l'octet de poids faible est à l'adresse à plus petite). |
| 132 | |
| 133 | L'adresse d'un mot (4 octets) de donnée ou d'instruction doit être multiple de 4. L'adresse d'un demi-mot doit être multiple de 2, on dit que les adresses doivent être "alignées". Le processeur part en exception si une instruction calcule une adresse qui ne respecte pas cette contrainte. Plus généralement, une donnée est alignée en mémoire, si l'adresse de son premier octet (à l'adresse la plus petite) est un multiple de sa taille. |
141 | | === 3) Mémoire virtuelle |
142 | | |
143 | | |
144 | | Pour des raisons de simplicité, cette version du processeur MIPS32 ne possède pas de mémoire virtuelle, c'est à dire que le processeur ne contient aucun mécanisme matériel de traduction des adresses virtuelles en adresses physiques. Les adresses calculées par le logiciel sont donc transmises au système mémoire sans modifications. |
145 | | |
146 | | On suppose que la mémoire répond en un cycle. Un signal permet au système mémoire de "geler" le processeur s'il n'est pas capable de répondre en un cycle (ce mécanisme peut être utilisé pour gérer les MISS du ou des caches). |
147 | | |
148 | | |
149 | | |
150 | | === 4) Protection mémoire |
151 | | |
152 | | |
153 | | En l’absence de mémoire virtuelle, l’espace mémoire est simplement découpé en 2 segments identifiés par le bit de poids fort de l’adresse : |
| 147 | |
| 148 | === 3) Protection mémoire |
| 149 | |
| 150 | |
| 151 | L’espace d'adressage de la mémoire est découpé en 2 parties identifiés par le bit de poids fort de l’adresse : |
156 | | adr 31 = 0 ==> segment utilisateur |
157 | | adr 31 = 1 ==> segment système |
158 | | }}} |
159 | | |
160 | | Quand le processeur est en mode superviseur, 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. |
| 154 | bit n°31 de l'adresse = 0 ==> partie utilisateur |
| 155 | bit n°0 de l'adresse = 1 ==> partie système |
| 156 | }}} |
| 157 | |
| 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. |
575 | | Le processeur doit alors passer en mode superviseur, 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: |
| 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: |
602 | | 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 superviseur 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 : |
| 600 | 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 : |