Changes between Version 20 and Version 21 of Archi-1-TP10


Ignore:
Timestamp:
Jan 1, 2021, 10:57:58 AM (4 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Archi-1-TP10

    v20 v21  
    339339'''''''''''''''
    340340}}}
    341 1. `$26` et `$27` sont deux registres temporaires que le noyau se réserve pour faire des calcul sans qu'il ait besoin de les sauvegarder dans la pile. Ce ne sont pas des registres système comme `c0_sr` ou `c0_epc`. En effet l'usage de `$26` et `$27` par l'utilisateur ne provoque pas d'exception du MIPS, mais si le noyau est appelé, il modifie ces registres et donc l'utilisateur perd leur valeur. Le code assembleur ci-après contient les instructions exécutées par le noyau quelque-soit la cause. Les commentaires présents dans le code ont été volontairement retirés. La section `.kentry` sera placée à l'adresse `0x80000000` par l'éditeur de lien. La direction `.org` (ligne 16) permet de déplacer le pointeur de remplissage de la section courante du nombre d'octets donnés en argument, ici `0x180`. Pouvez-vous dire pourquoi ? Expliquer le c
     3411. `$26` et `$27` sont deux registres temporaires que le noyau se réserve pour faire des calcul sans qu'il ait besoin de les sauvegarder dans la pile. Ce ne sont pas des registres système comme `c0_sr` ou `c0_epc`. En effet l'usage de `$26` et `$27` par l'utilisateur ne provoque pas d'exception du MIPS, mais si le noyau est appelé, il modifie ces registres et donc l'utilisateur perd leur valeur. Le code assembleur ci-après contient les instructions exécutées par le noyau quelque-soit la cause. Les commentaires présents dans le code ont été volontairement retirés. La section `.kentry` sera placée à l'adresse `0x80000000` par l'éditeur de lien. La directive `.org` (ligne 16) permet de déplacer le pointeur de remplissage de la section courante du nombre d'octets donnés en argument, ici `0x180`. Pouvez-vous dire pourquoi ? Expliquer les lignes 25 à 28.\\ \\**`kernel/hcpu.S`**
    342342{{{#!c
    343343 15 .section    .kentry,"ax"     
     
    356356'''''''''''''''
    357357}}}
    358 1. Comment le noyau traite les causes d'invocation?
    359 {{{#!protected ------------------------------------------------------------------------------------
    360 '''''''''''''''
    361 -
    362 '''''''''''''''
    363 }}}
    364 1. comment fonctionne le gestionnaire de syscall?
     3581. 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`\\ \\**`kernel/ksyscalls.c`**
     359{{{#!c
     360void *syscall_vector[] = {
     361    [0 ... SYSCALL_NR - 1] = unknown_syscall,
     362    [SYSCALL_EXIT]      = exit,
     363    [SYSCALL_TTY_READ]  = tty_read,
     364    [SYSCALL_TTY_WRITE] = tty_write,
     365    [SYSCALL_CLOCK]     = clock,
     366};
     367}}}
     368  **`kernel/hcpu.S`**
     369{{{#!c
     370 34 ksyscall:
     371 35
     372 36     addiu   $29,    $29,    -8*4           
     373 37     mfc0    $27,    $14                     
     374 38     mfc0    $26,    $12                     
     375 39     addiu   $27,    $27,    4               
     376 40     sw      $31,    7*4($29)               
     377 41     sw      $27,    6*4($29)               
     378 42     sw      $26,    5*4($29)               
     379 43     sw      $2,     4*4($29)               
     380 44     mtc0    $0,     $12                     
     381 45
     382 46     la      $26,    syscall_vector         
     383 47     andi    $2,     $2,     SYSCALL_NR-1   
     384 48     sll     $2,     $2,     2               
     385 49     addu    $2,     $26,    $2             
     386 50     lw      $2,     ($2)                   
     387 51     li      $26,    0xFF00                 
     388 52     jalr    $2                             
     389 53
     390 54     lw      $26,    5*4($29)               
     391 55     lw      $27,    6*4($29)               
     392 56     lw      $31,    7*4($29)               
     393 57     mtc0    $26,    $12                     
     394 58     mtc0    $27,    $14                     
     395 59     addiu   $29,    $29,    8*4             
     396 60     eret                       
     397}}}
    365398{{{#!protected ------------------------------------------------------------------------------------
    366399'''''''''''''''