Changes between Version 100 and Version 101 of Archi-1-TP10
- Timestamp:
- Dec 4, 2021, 6:27:40 PM (4 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
Archi-1-TP10
v100 v101 355 355 { 356 356 [...] 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); 359 359 } 360 360 361 361 hcpua.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 code364 mtc0 $4, $14 // put _start address in c0_EPC365 li $26, 0x12 // define next status reg. value366 mtc0 $26, $12 // UM <- 1, IE <- 0, EXL <- 1367 la $29, __data_end // define new user stack pointer362 .globl app_load 363 app_load: 364 mtc0 $4, $14 365 li $26, 0x12 366 mtc0 $26, $12 367 la $29, __data_end 368 368 eret 369 369 }}} 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. 376 380 - 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` 377 381 - 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). 380 385 '' 381 386 }}} … … 729 734 │ └── Makefile : description des actions possibles sur le code kernel : compilation et nettoyage 730 735 └── 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() 732 737 ├── main.c : fonction principale de l'application 733 738 ├── user.ld : ldscript décrivant l'espace d'adressage pour l'édition de liens du user … … 811 816 │ └── Makefile : description des actions possibles sur le code kernel : compilation et nettoyage 812 817 └── 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() 814 819 ├── main.c : fonction principale de l'application 815 820 ├── user.ld : ldscript décrivant l'espace d'adressage pour l'édition de liens du user … … 890 895 │ └── Makefile : description des actions possibles sur le code user : compilation et nettoyage 891 896 └── 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() 893 898 ├── libc.h : API pseudo-POSIX de la bibliothèque C 894 899 ├── libc.c : code source de la libc