Changes between Version 11 and Version 12 of Archi-1-TD10


Ignore:
Timestamp:
Nov 19, 2022, 7:27:52 PM (2 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Archi-1-TD10

    v11 v12  
    161161''
    162162}}}
    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.
     1631. 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.
    164164{{{#!c
    165165kinit.c:
     
    180180        eret 
    181181}}}
    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)
    183183{{{#!protected ------------------------------------------------------------------------------------
    184184''
    185185- 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''
    186191- `.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''
    187197- 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.
    188198- `$26` est un registre temporaire pour le noyau, il peut l'utiliser sans le sauver avant et donc sans le restaurer.
     
    194204      **mais** comme `EXL`=`1`, alors on reste en mode `kernel` avec interruptions masquées.
    195205  - 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''
    196211- 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).
    197212''