Changes between Version 16 and Version 17 of Archi-1-TP10


Ignore:
Timestamp:
Dec 30, 2020, 3:41:59 PM (4 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Archi-1-TP10

    v16 v17  
    262262 14                          "mtc0   $26,    $14            \n"     // put it in c0_EPC
    263263 15                          "li     $26,    0b00010010     \n"     // next status [UM,0,ERL,EXL,IE]     
    264  16                          "mtc0   $26,    $12            \n"     // UM <- 1, IE <- 0, EXL <- 1
     264 16                          "mtc0   $26,    $12            \n"     // UM <- 1, EXL <- 1, IE <- 0
    265265 17                          "la     $29,    __data_end     \n"     // define new user stack pointer
    266266 18                          "eret                          \n");   // j EPC and EXL <- 0
     
    297297'''''''''''''''
    298298}}}
    299 1. Dans la question **A2.5**, nous avons vu comment la fonction `kinit` appelle la fonction `__start()` grâce à bout de code assembleur. Nous allons voir maintenant quelles sont les condition de cet appel. Dans le code de la question **A2.5**, `$26` est un registre de travail pour le kernel. Quels sont les autres registres modifiés? Expliquez pour chacun la valeur affectée.
    300 {{{#!protected ------------------------------------------------------------------------------------
    301 '''''''''''''''
    302 -
     2991. Dans la question **A2.5**, nous avons vu comment la fonction `kinit` appelle la fonction `__start()` grâce à un bout de code en assembleur. Nous allons voir maintenant quelles sont les conditions de cet appel. Dans le code de la question **A2.5**, `$26` est un registre de travail pour le kernel. Quels sont les autres registres modifiés? Expliquez pour chacun la valeur affectée.
     300{{{#!protected ------------------------------------------------------------------------------------
     301'''''''''''''''
     302- Il y a 3 registres affectés, dans l'ordre :
     303  - Le registre système `$14` nommé `c0_EPC`, il reçoit l'adresse `__crt0`, c'est-à-dire l'adresse de la fonction `__start()`.
     304  - 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`
     305    - UM = 1 et IE = 0, signifie que l'on est normalement en mode `user` interruptions masquées,
     306      **mais** comme `EXL` est à 1, on reste en mode `kernel` interruptions masquées. L'exécution de l'instruction `eret` mettra `EXL`
     307      à `0` pour rendre le bit `UM` actif et passer en mode `user`.
     308  - 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. 
    303309'''''''''''''''
    304310}}}