Changes between Version 87 and Version 88 of Archi-1-TP10


Ignore:
Timestamp:
Nov 23, 2021, 10:01:03 AM (3 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Archi-1-TP10

    v87 v88  
    121121{{{#!protected ------------------------------------------------------------------------------------
    122122''
    123 Cours 10 / slide 11
     123Cours 10 / slides 10 et 11
    124124 || 0|| IE  ||Interrupt Enable||0 → interruptions masquées\\1 → interruptions autorisées
    125125 || 1|| EXL ||EXception Level ||1 → MIPS en mode exception\\à l'entrée dans le kernel, le MIPS est en mode kernel, interruptions masquées
     
    1301301. 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
    131131{{{#!protected ------------------------------------------------------------------------------------
    132 '''''''''''''''
     132''
     133Cours 10 / slide 12
    133134- 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.
    135136
    136137  ||0|| 0000,,b,, || interruption || un contrôleur de périphérique à lever un signal IRQ
    137138  ||4|| 0100,,b,, || ADEL         || lecture non-alignée (p. ex. `lw` a une adresse impaire)
    138139  ||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}}}
     1421. 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''
     145Cours 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.
    145147- 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''
    147149}}}
    1481501. 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?
    149151{{{#!protected ------------------------------------------------------------------------------------
    150 '''''''''''''''
     152''
     153Cours 10 / slide 9
    151154- Les trois instructions sont
    152155
     
    154157  || `mfc0 $GPR, $C0` || `M`ove `F`rom `C`oprocessor `0` || `$GPR` ←  COPRO_0(`$C0`)
    155158  || `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).
    156161- 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''
    158163}}}
    1591641. Quelle est l'adresse d'entrée dans le noyau?
    160165{{{#!protected ------------------------------------------------------------------------------------
    161 '''''''''''''''
     166''
     167Cours 10 / slide 13
    162168- 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''
    165171}}}
    1661721. Que se passe-t-il quand le MIPS entre dans le noyau, après l'exécution de l'instruction `syscall`?