Changes between Version 13 and Version 14 of AS6-TME-B1


Ignore:
Timestamp:
Feb 9, 2022, 9:42:56 AM (3 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AS6-TME-B1

    v13 v14  
    696696{{{#!protected ------------------------------------------------------------------------------------
    697697''
    698 - La fonction `syscall()` a 5 a arguments
     698- La fonction `syscall()` a 5 arguments
    699699- Elle reçoit ses 4 premiers arguments dans les registres $4 à $7 et le 5e (le numéro de service) dans la pile.
    700700- La ligne 3 sert à dire que syscall est une étiquette utilisée dans un autre fichier. `.globl` signifie **glob**al **l**abel. Si on la retire, il y aura un problème lors de l'édition de lien. `syscall()` ne sera pas trouvé par l'éditeur de liens.
     
    723723'''''''''''''''
    724724}}}
    725 1. Dans la question **A6.5**, nous avons vu comment la fonction `kinit()` appelle la fonction `__start()` grâce à un bout de code en assembleur placé au début de la section `.text`. Nous allons voir maintenant quelles sont les conditions de cet appel. Dans le code de la question **A6.5**, `$26` est un registre de travail pour le kernel. Quels sont les autres registres modifiés? Expliquez pour chacun la valeur affectée.
     7251. La fonction `kinit()` appelle la fonction `__start()` : `kernel/kinit.c`
     726{{{#!c
     727void kinit (void)
     728{
     729    kprintf (banner);
     730
     731    // put bss sections to zero. bss contains uninitialised global variables
     732    extern int __bss_origin;    // first int of bss section (defined in ldscript kernel.ld)
     733    extern int __bss_end;       // first int of above bss section (defined in ldscript kernel.ld)
     734    for (int *a = &__bss_origin; a != &__bss_end; *a++ = 0);
     735
     736    extern int _start;          // _start is the entry point of the app (defined in kernel.ld)
     737    app_load (&_start);         // function to start the user app (defined in hcpua.S)
     738}
     739}}}
     740 `kernel/hcpua.S`
     741{{{#!asm
     742.globl app_load // ----------------------- void app_load (void * fun) called by kinit()
     743app_load:                               // call when we exit kinit() function to go to user code
     744
     745    mtc0   $4,      $14                 // put _start address in c0_EPC
     746    li     $26,     0x12                // define next status reg. value
     747    mtc0   $26,     $12                 // UM <- 1, IE <- 0, EXL <- 1
     748    la     $29,    __data_end           // define new user stack pointer
     749    eret                                // j EPC and EXL <- 0
     750}}}
     751 Dans le code précédent, `$26` est un registre de travail pour le kernel. Quels sont les autres registres modifiés? Expliquez pour chacun la valeur affectée.
    726752{{{#!protected ------------------------------------------------------------------------------------
    727753'''''''''''''''
     
    761787 26     andi    $26,    $26,    0x3C         
    762788 27     li      $27,    0x20                   
    763  28     bne     $26,    $27,    not_syscall     
     789 28     bne     $26,    $27,    kpanic     
    764790}}}
    765791{{{#!protected ------------------------------------------------------------------------------------
     
    770796  - Ligne 26 : `$26` **←**  `$26 & 0b00111100`\\⟶ C'est un masque qui permet de ne conserver que les 4 bits du champ `XCODE`.
    771797  - 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`.
    772   - 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.
     798  - Ligne 28 : si `$26` ≠ `$27` goto kpanic\\⟶ Si ce n'est pas un `syscall`, on va plus loin, sinon on continue en séquence.
    773799'''''''''''''''
    774800}}}