Changes between Version 33 and Version 34 of Archi-1-TP10


Ignore:
Timestamp:
Jan 2, 2021, 12:10:13 PM (4 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Archi-1-TP10

    v33 v34  
    355355- La section `kentry` est placée à l'adresse `0x80000000` or l'entrée du noyau est `0x80000180`, il faut donc déplacer le pointeur de remplissage de la section `ktentry` de `0x180`. Remarquez qu'on aurait pu utiliser une directive `.space 0x180`.
    356356- Commentaire du code
    357   - Ligne 25 : $26 **←**  c0_cause\\⟶ donc le registre GPR réservé au kernel prend la valeur du registre de cause.
    358   - Ligne 26 : $26 **←**  $26 & 0b00111100\\⟶ C'est un masque qui permet de ne conserver que les 4 bits du champ `XCODE`.
    359   - Ligne 27 : $27 **←**  0b00100000\\⟶ On initialise le registre GPR réservé au kernel $27 avec la valeur attendue dans $26 s'il s'agit d'une cause `syscall`.
    360   - Ligne 28 : si $26 ≠ $27 goto not_syscall\\⟶ Si ce n'est pas un syscall, on va plus loin, sinon on continue en séquence.
    361 '''''''''''''''
    362 }}}
    363 1. Le gestionnaire de syscall est la partie du code qui gère le comportement du noyau lors de l'exécution de l'instruction `syscall`. C'est un code en assembleur présent dans le fichier `kernel/hcpu.S` que nous allons observer. Pour vous aider dans la compréhension de ce code, vous devez imaginer que l'instruction `syscall` est un peu comme un appel de fonction. Ce code utilise un tableau de pointeurs de fonctions nommé `syscall_vector` définit dans le fichier `kernel/ksyscalls.c`. Les lignes `36` à `43` sont chargées d'allouer dans la pile. Dessinez l'état de la pile après l'exécution de ces instructions. Que fait l'instruction lige `44` et quelle conséquence cela a? Que font les lignes `46` à `52`? Et enfin que font les lignes `54` à `60`\\ \\**`common/syscalls.h`**
     357  - Ligne 25 : `$26` **←**  `c0_cause`\\⟶ donc le registre GPR réservé au kernel prend la valeur du registre de cause.
     358  - Ligne 26 : `$26` **←**  `$26 & 0b00111100`\\⟶ C'est un masque qui permet de ne conserver que les 4 bits du champ `XCODE`.
     359  - Ligne 27 : `$27` **←**  `0b00100000`\\⟶ On initialise le registre GPR réservé au kernel $27 avec la valeur attendue dans $26 s'il s'agit d'une cause `syscall`.
     360  - Ligne 28 : si `$26` ≠ `$27` goto not_syscall\\⟶ Si ce n'est pas un syscall, on va plus loin, sinon on continue en séquence.
     361'''''''''''''''
     362}}}
     3631. Le gestionnaire de syscall est la partie du code qui gère le comportement du noyau lors de l'exécution de l'instruction `syscall`. C'est un code en assembleur présent dans le fichier `kernel/hcpu.S` que nous allons observer. Pour vous aider dans la compréhension de ce code, vous devez imaginer que l'instruction `syscall` est un peu comme un appel de fonction. Ce code utilise un tableau de pointeurs de fonctions nommé `syscall_vector` définit dans le fichier `kernel/ksyscalls.c`. Les lignes `36` à `43` sont chargées d'allouer dans la pile. Dessinez l'état de la pile après l'exécution de ces instructions. Que fait l'instruction lige `44` et quelle conséquence cela a? Que font les lignes `46` à `51`? Et enfin que font les lignes `53` à `59`\\ \\**`common/syscalls.h`**
    364364{{{#!c
    365365  1 #define SYSCALL_EXIT        0
     
    398398 49     addu    $2,     $26,    $2             
    399399 50     lw      $2,     ($2)                   
    400  51     li      $26,    0xFF00                 
    401  52     jalr    $2                             
    402  53
    403  54     lw      $26,    5*4($29)               
    404  55     lw      $27,    6*4($29)               
    405  56     lw      $31,    7*4($29)               
    406  57     mtc0    $26,    $12                     
    407  58     mtc0    $27,    $14                     
    408  59     addiu   $29,    $29,    8*4             
    409  60     eret                       
     400 51     jalr    $2                             
     401 52
     402 53     lw      $26,    5*4($29)               
     403 54     lw      $27,    6*4($29)               
     404 55     lw      $31,    7*4($29)               
     405 56     mtc0    $26,    $12                     
     406 57     mtc0    $27,    $14                     
     407 58     addiu   $29,    $29,    8*4             
     408 59     eret                       
    410409}}}
    411410{{{#!protected ------------------------------------------------------------------------------------
     
    433432- L'instruction ligne 44 met `0` dans le registre `c0_sr`. Ce qui a pour conséquence de mettre à `0` les bits `UM`, `EXL` et `IE`. On est donc en mode kernel avec interruptions masquées.\\ \\''Notez qu'interdire les interruptions pendant l'exécution des syscall est contraignant. Pour le moment, ce n'est pas important puisque nous ne traitons pas encore les interruptions, mais lorsque nous les traiterons, elles seront masquées. En conséquence, il sera interdit aux fonctions qui traitent les appels système d'exécuter des attentes longues (comme une boucle qui attend le changement d'état d'un registre de périphérique) car sinon, le noyau sera bloqué (plus rien ne bouge).''
    434433- Commentaire du code
    435   - Ligne 46 : $26 **←** l'adresse du tableau syscall_vector\\⟶ On s'apprête à y faire un accès indexé par le registre $2
    436   - Ligne 47 : $2  **←** $2 @ 0x1F \\⟶
    437   - Ligne 48 :  **←**  \\⟶
    438   - Ligne 49 :  **←**  \\⟶
     434  - Ligne 46 : `$26` **←** l'adresse du tableau syscall_vector\\⟶ On s'apprête à y faire un accès indexé par le registre `$2`
     435  - Ligne 47 : `$2`  **←** `$2 & 0x1F`\\⟶ pour éviter de sortir du tableau si l'utilisateur à mis n'importe quoi dans `$2`
     436  - Ligne 48 : `$2`  **←** `$2 * 4`\\⟶ Les cases du tableau sont des pointeurs et font 4 octets
     437  - Ligne 49 : `$2`  **←** `$26 + $2`\\⟶
    439438  - Ligne 50 :  **←**  \\⟶
    440439  - Ligne 51 :  **←**  \\⟶
    441   - Ligne 52 :  **←**  \\⟶
    442440'''''''''''''''
    443441}}}