Changes between Version 87 and Version 88 of Archi-1-TP10
- Timestamp:
- Nov 23, 2021, 10:01:03 AM (3 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
Archi-1-TP10
v87 v88 121 121 {{{#!protected ------------------------------------------------------------------------------------ 122 122 '' 123 Cours 10 / slide 11123 Cours 10 / slides 10 et 11 124 124 || 0|| IE ||Interrupt Enable||0 → interruptions masquées\\1 → interruptions autorisées 125 125 || 1|| EXL ||EXception Level ||1 → MIPS en mode exception\\à l'entrée dans le kernel, le MIPS est en mode kernel, interruptions masquées … … 130 130 1. Le registre cause est contient la cause d'appel du kernel.\\Dites à quel endroit est stockée cette cause et donnez la signification des codes 0, 4 et 8 131 131 {{{#!protected ------------------------------------------------------------------------------------ 132 ''''''''''''''' 132 '' 133 Cours 10 / slide 12 133 134 - Le champ `XCODE` qui contient le code de la cause d'entrée dans le noyau est codé sur 4 bits entre les bits 2 et 5. 134 - Les valeurs les plus importantes sont 0 (interruption et syscall). Les autres valeurs sont considérées comme des exceptions.135 - Les valeurs les plus importantes sont 0 et 8 (interruption et syscall). Les autres valeurs sont des exceptions, c'est-à-dire des fautes faites par le programme. 135 136 136 137 ||0|| 0000,,b,, || interruption || un contrôleur de périphérique à lever un signal IRQ 137 138 ||4|| 0100,,b,, || ADEL || lecture non-alignée (p. ex. `lw` a une adresse impaire) 138 139 ||8|| 1000,,b,, || syscall || exécution de l'instruction `syscall` 139 ''''''''''''''' 140 }}} 141 1. Le registre `C0_EPC` est un registre 32 bits qui contient une adresse. Vous devriez l'avoir décrit dans la question 2.\\Expliquez pourquoi ce doit être l'adresse de l'instruction qui provoque une exception qui doit être stockée dans `C0_EPC`? 142 {{{#!protected ------------------------------------------------------------------------------------ 143 ''''''''''''''' 144 - Une exception, c'est une erreur du programme, telle qu'une division par 0, une lecture non alignée ou une instruction illégale. Il est important que le gestionnaire d'exception sache quelle est l'instruction fautive. C'est pour cette raison que EPC contient l'adresse de l'instruction fautive. Le gestionnaire pourra lire l'instruction et éventuellement corriger le problème. 140 '' 141 }}} 142 1. Le registre `C0_EPC` est un registre 32 bits qui contient une adresse. Vous devriez l'avoir décrit dans la question 2.\\Expliquez pourquoi, dans le cas d'une exception, ce doit être l'adresse de l'instruction qui provoque une exception qui doit être stockée dans `C0_EPC`? 143 {{{#!protected ------------------------------------------------------------------------------------ 144 '' 145 Cours 10 / slide 13 146 - Une exception, c'est une erreur du programme, telle qu'une division par 0, une lecture non alignée ou une instruction illégale. Il est important que le gestionnaire d'exception sache quelle est l'instruction fautive. C'est pour cette raison que le registre EPC contient l'adresse de l'instruction fautive. Le gestionnaire pourra lire l'instruction et éventuellement corriger le problème. 145 147 - A titre indicatif, ce n'est pas la question, mais pour les syscall, c'est aussi l'adresse de l'instruction `syscall` qui est stockée dans `C0_EPC`, or pour le retour de `syscall`, on souhaite aller à l'instruction suivante. Il faut donc incrémenter la valeur de `C0_EPC` de 4 (les instructions font 4 octets) pour connaître l'adresse de retour. 146 '' '''''''''''''148 '' 147 149 }}} 148 150 1. Nous avons vu trois instructions utilisables **seulement** lorsque le MIPS est en mode kernel, lesquelles? Que font-elles?\\Est-ce que l'instruction `syscall` peut-être utilisée en mode user? 149 151 {{{#!protected ------------------------------------------------------------------------------------ 150 ''''''''''''''' 152 '' 153 Cours 10 / slide 9 151 154 - Les trois instructions sont 152 155 … … 154 157 || `mfc0 $GPR, $C0` || `M`ove `F`rom `C`oprocessor `0` || `$GPR` ← COPRO_0(`$C0`) 155 158 || `eret` || `E`xpection `RET`urn || `PC` ← `EPC` ; `c0_sr.EXL` ← `0` 159 160 Attention à l'ordre des registres dans les instructions. L'ordre est toujours le même, c'est d'abord le registre $GPR puis le registre $C0, le sens de l'échange est défini par l'opcode de l'instruction (move `TO` ou move `FROM` coprocessor 0). 156 161 - Bien sûr que `syscall` peut être utilisé en mode user, puisque c'est comme ça qu'on entre dans le kernel pour les demandes de services. 157 '' '''''''''''''162 '' 158 163 }}} 159 164 1. Quelle est l'adresse d'entrée dans le noyau? 160 165 {{{#!protected ------------------------------------------------------------------------------------ 161 ''''''''''''''' 166 '' 167 Cours 10 / slide 13 162 168 - C'est `0x80000180`. Il n'y a qu'une adresse pour toutes les causes `syscall`, exception et interruption. 163 - En fait, on peut considérer que `0xBFC00000` permet aussi d'entrer dans le noyau après un reset.164 '' '''''''''''''169 - (slides 16 et 17) Il y a aussi l'adresse de la fonction `kinit()` qui est la fonction appelée par le code de boot (à l'adresse `0xBFC00000`) pour entrer dans le noyau. 170 '' 165 171 }}} 166 172 1. Que se passe-t-il quand le MIPS entre dans le noyau, après l'exécution de l'instruction `syscall`?