Changes between Version 100 and Version 101 of Archi-1-TP10


Ignore:
Timestamp:
Dec 4, 2021, 6:27:40 PM (4 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Archi-1-TP10

    v100 v101  
    355355    {
    356356        [...]
    357         extern int _start;          // _start is the entry point of the app (defined in kernel.ld)
    358         app_load (&_start);         // function to start the user app (defined in hcpua.S)
     357        extern int _start;   
     358        app_load (&_start);   
    359359    }
    360360
    361361hcpua.S:
    362     .globl app_load // --------------- void app_load (void * fun) called by kinit()
    363     app_load:                       // call when we exit kinit() function to go to user code
    364         mtc0   $4,      $14         // put _start address in c0_EPC
    365         li     $26,     0x12        // define next status reg. value
    366         mtc0   $26,     $12         // UM <- 1, IE <- 0, EXL <- 1
    367         la     $29,    __data_end   // define new user stack pointer
     362    .globl app_load
     363    app_load:                     
     364        mtc0   $4,      $14       
     365        li     $26,     0x12       
     366        mtc0   $26,     $12         
     367        la     $29,    __data_end   
    368368        eret 
    369369}}}
    370  Où est définit `_start` ? À 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 `?
    371 {{{#!protected ------------------------------------------------------------------------------------
    372 ''
    373 Il faut lire le code assembleur et expliquer ce qui s'y trouve :
    374 - Il y a 3 registres affectés, dans l'ordre :
    375   - Le registre système `$14` nommé `c0_epc`, il reçoit l'adresse `__crt0`, c'est-à-dire l'adresse de la fonction `__start()`.
     370 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 `?
     371{{{#!protected ------------------------------------------------------------------------------------
     372''
     373- 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`.
     374- `.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`).
     375- 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.
     376- `$26` est un registre temporaire pour le noyau, il peut l'utiliser sans le sauver avant et donc sans le restaurer.
     377- Il y a 4 registres affectés, dans l'ordre :
     378  - Le registre système `$14` nommé `c0_epc`, il reçoit l'adresse `_start`, c'est-à-dire l'adresse de la fonction `_start()`.
     379  - `$26` affecté à `0x12`, c'est un registre temporaire pour le noyau.
    376380  - Le registre système `$12` nommé `c0_sr`, il reçoit la valeur `0x12`, donc les bits `UM`, `EXL` et `IE` prennent respectivement les valeurs `1`, `1` et `0`
    377381    - UM = 1 et IE = 0, signifie que l'on est normalement en mode `user` avec les interruptions masquées,
    378       **mais** comme `EXL`=`1`, alors on reste en mode `kernel` avec interruptions masquées. 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).
    379   - 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. 
     382      **mais** comme `EXL`=`1`, alors on reste en mode `kernel` avec interruptions masquées.
     383  - 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.
     384- 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).
    380385''
    381386}}}
     
    729734│   └── Makefile    : description des actions possibles sur le code kernel : compilation et nettoyage
    730735└── user ──────────── Répertoire des fichiers composant l'application user
    731     ├── crt0.c      : fonctions d'interface entre kernel et user, pour le moment : crt0()
     736    ├── crt0.c      : fonctions d'interface entre kernel et user, pour le moment : _start()
    732737    ├── main.c      : fonction principale de l'application
    733738    ├── user.ld     : ldscript décrivant l'espace d'adressage pour l'édition de liens du user
     
    811816│   └── Makefile    : description des actions possibles sur le code kernel : compilation et nettoyage
    812817└── user ──────────── Répertoire des fichiers composant l'application user
    813     ├── crt0.c      : fonctions d'interface entre kernel et user, pour le moment : crt0()
     818    ├── crt0.c      : fonctions d'interface entre kernel et user, pour le moment : _start()
    814819    ├── main.c      : fonction principale de l'application
    815820    ├── user.ld     : ldscript décrivant l'espace d'adressage pour l'édition de liens du user
     
    890895│   └── Makefile    : description des actions possibles sur le code user : compilation et nettoyage
    891896└── ulib ──────────── Répertoire des fichiers des bibliothèques système liés avec l'application user
    892     ├── crt0.c      : fonctions d'interface entre kernel et user, pour le moment : crt0()
     897    ├── crt0.c      : fonctions d'interface entre kernel et user, pour le moment : _start()
    893898    ├── libc.h      : API pseudo-POSIX de la bibliothèque C
    894899    ├── libc.c      : code source de la libc