Changes between Version 25 and Version 26 of Archi-1-TP11
- Timestamp:
- Dec 11, 2021, 11:08:27 AM (3 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
Archi-1-TP11
v25 v26 169 169 '' 170 170 }}} 171 1. Que signifie acquitter une IRQ et qui le demande à qui ? Comment demande-t-on l'acquittement ? 172 {{{#!protected ------------------------------------------------------------------------------------ 173 '' 174 * Cela signifie demander au contrôleur de périphérique concerné de baisser (désactiver) le signal IRQ. C'est l'ISR qui fait cette demande en accédant aux registres du contrôleur de périphérique. Chaque périphérique a sa propre méthode d'acquittement (il faut lire la documentation), pour le TTY, l'acquittement est fait en lisant le registre TTY_READ, pour le TIMER, l'acquittement est fait en écrivant n'importe quelle valeur dans le registre TIMER_RSTIRQ. 171 1. Que signifie acquitter une IRQ ? 172 {{{#!protected ------------------------------------------------------------------------------------ 173 '' 174 * Cela signifie demander au contrôleur de périphérique concerné de baisser (désactiver) le signal IRQ. 175 '' 176 }}} 177 1. Qui demande l'acquittement à qui ? 178 {{{#!protected ------------------------------------------------------------------------------------ 179 '' 180 * C'est l'ISR qui fait cette demande en accédant aux registres du contrôleur de périphérique. -. 181 '' 182 }}} 183 1. Comment demande-t-on l'acquittement ? 184 {{{#!protected ------------------------------------------------------------------------------------ 185 '' 186 * poliment :-) 187 * Chaque périphérique a sa propre méthode d'acquittement, il faut lire la documentation de chaque composant pour le savoir. Pour le TTY, l'acquittement est fait en lisant le registre TTY_READ, pour le TIMER, l'acquittement est fait en écrivant n'importe quelle valeur dans le registre TIMER_RSTIRQ. 175 188 '' 176 189 }}} … … 190 203 {{{#!protected ------------------------------------------------------------------------------------ 191 204 '' 192 * Il y a `0` .205 * Il y a `0`, et pour rappel `c0_cause.XCODE = 8` pour un syscall, les autres valeurs sont des numéros d'exception (division par 0, violation de privilège, etc.) 193 206 '' 194 207 }}} … … 196 209 {{{#!protected ------------------------------------------------------------------------------------ 197 210 '' 198 * C'est l'adresse de retour dans le programme interrompu. 211 * C'est l'adresse de retour dans le programme interrompu. Quand le processeur reçoit une IRQ alors qu'il est en train d'exécuter l'instruction n°`i` à l'adresse `PC` (Program Counter), alors le MIPS termine l'exécution de l'instruction `i`, puis il enregistre `PC+4` (adresse de l'instruction n°`i+1`) dans `c0_EPC` et il saute à l'adresse `0x80000180`. 199 212 '' 200 213 }}} … … 202 215 {{{#!protected ------------------------------------------------------------------------------------ 203 216 '' 204 * Le bit `EXL` passe à 1 et la conséquence est que le MIPS passe en mode kernel, toutes les sont interruptions masquées .217 * Le bit `EXL` passe à 1 et la conséquence est que le MIPS passe en mode kernel, toutes les sont interruptions masquées quelque-soit les valeurs de `c0_STATUS.UM` et `c0_STATUS.IE` (respectivement le mode d'exécution et le masque d'interruption général). 205 218 '' 206 219 }}} … … 211 224 '' 212 225 }}} 213 1. À l'entrée dans le noyau, `kentry` analyse le champ `XCODE` du registre de `c0_cause` et si c'est `0` alors il saut au code donné ci-après (ce n'est pas exactement le code que vous pouvez voir dans les fichiers sources pour que ce soit plus facile à comprendre).226 1. À l'entrée dans le noyau, `kentry` analyse le champ `XCODE` du registre de `c0_cause` et si c'est `0` alors il saute au code donné ci-après (ce n'est pas exactement le code que vous pouvez voir dans les fichiers sources pour que ce soit plus facile à comprendre). 214 227 {{{#!c 215 228 cause_irq: … … 223 236 sw $1, 1*4($29) // save all temporary registers including HI and LO 224 237 sw $2, 2*4($29) 225 [etc. ]238 [etc. pour les autres sw de registres temporaires] 226 239 227 240 jal irq_handler // call the irq handler fontion écrite en C … … 229 242 lw $1, 1*4($29) // restore all temporary registers including HI and LO 230 243 lw $2, 2*4($29) 231 [etc. ]244 [etc. pour les autres lw de registres temporaires] 232 245 lw $26, 20*4($29) // get old SR 233 246 lw $27, 21*4($29) // get return address of syscall