Changes between Version 11 and Version 12 of Archi-1-TD10
- Timestamp:
- Nov 19, 2022, 7:27:52 PM (2 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
Archi-1-TD10
v11 v12 161 161 '' 162 162 }}} 163 1. Regardons comment la fonction `kinit()` appelle la fonction `__start()`, il y a deux fichiers impliqués `kinit.c` et `hcpua.S`, les commentaires ont été r étirés.163 1. Regardons comment la fonction `kinit()` appelle la fonction `__start()`, il y a deux fichiers impliqués `kinit.c` et `hcpua.S`, les commentaires ont été retirés. Pour rappel, la fonction `__start()` est la fonction d'entrée de l'application utilisateur, c'est elle qui appelle la fonction `main()`. La fonction `start()` est donc dans le code de l'application, et non pas dans le noyau. Cependant le noyau doit connaitre son adresse afin de pouvoir y sauter et ainsi entrer dans l'application. 164 164 {{{#!c 165 165 kinit.c: … … 180 180 eret 181 181 }}} 182 Où se trouve la fonction `_start` et comment le kernel connaît-il son adresse ? À quoi sert `.globl app_load `? Quels sont les registres utilisés dans le code de `app_load `? Que savez-vous de l'usage de `$26 `? Quels sont les registres modifiés ? Expliquez pour chacun la valeur affectée. Que fait l'instruction `eret `?182 Où se trouve la fonction `_start` et comment le kernel connaît-il son adresse ? (C10 S30+S32) 183 183 {{{#!protected ------------------------------------------------------------------------------------ 184 184 '' 185 185 - La fonction `_start` est au début de la section `.text` (code de l'utilisateur). Le noyau connait cette adresse parce qu'elle est définit dans son fichier `ldscript`. 186 '' 187 }}} 188 À quoi sert `.globl app_load `? (C9 S18 C10 S20) 189 {{{#!protected ------------------------------------------------------------------------------------ 190 '' 186 191 - `.globl app_load` est nécessaire parce que ce label de fonction est défini dans le fichier `hcpua.S` mais il est utilisé dans un autre (`kinit.c`). 192 '' 193 }}} 194 Quels sont les registres utilisés dans le code de `app_load `? Que savez-vous de l'usage de `$26 `? Quels sont les registres modifiés ? Expliquez pour chacun la valeur affectée. 195 {{{#!protected ------------------------------------------------------------------------------------ 196 '' 187 197 - Les registres utilisés par `app_load` sont `$4`, `$26`, `$29` du banc GPR et `$12` (`c0_sr`) et `$14` (`c0_epc`) du banc de registres système. 188 198 - `$26` est un registre temporaire pour le noyau, il peut l'utiliser sans le sauver avant et donc sans le restaurer. … … 194 204 **mais** comme `EXL`=`1`, alors on reste en mode `kernel` avec interruptions masquées. 195 205 - Le registre GPR `$29` reçoit l'adresse de la première adresse **après** la section `.data`. C'est le haut de la pile. 206 '' 207 }}} 208 Que fait l'instruction `eret `? 209 {{{#!protected ------------------------------------------------------------------------------------ 210 '' 196 211 - L'exécution de l'instruction `eret` mettra `EXL` à `0` pour rendre les bits `UM` et `IE` actifs et passer en mode `user` (ici avec interruptions masquées). 197 212 ''