Changes between Version 31 and Version 32 of Archi-1-TD10


Ignore:
Timestamp:
Nov 17, 2023, 11:44:35 AM (19 months ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Archi-1-TD10

    v31 v32  
    261261''
    262262}}}
    263 1. On rappelle que `$26` et `$27` sont deux registres GPR temporaires **''réservés''** pour le noyau pour faire des calculs sans qu'il ait besoin de les sauvegarder dans la pile. **Ce ne sont pas des registres du coprocesseur 0** comme `c0_sr` ou `c0_epc`. En effet, l'usage de ces registres (`$26` et `$27`) par l'utilisateur ne provoque pas d'exception du MIPS. Toutefois si le noyau est appelé alors il modifie ces registres et donc l'utilisateur perd leur valeur.\\Le code assembleur ci-après contient les instructions exécutées à l'entrée dans le noyau, quelle que soit la cause. Les commentaires présents dans le code ont été volontairement retirés (ils sont dans le cours et dans les fichiers du TP). La section `.kentry` est placée à l'adresse `0x80000000` par l'éditeur de lien.\\ \\**`kernel/hcpua.S`**
     2631. On rappelle que `$26` et `$27` sont deux registres GPR temporaires **''réservés''** pour le noyau pour faire des calculs sans qu'il ait besoin de les sauvegarder dans la pile. **Ce ne sont pas des registres du coprocesseur 0** comme `c0_sr` ou `c0_epc`. En effet, l'usage de ces registres (`$26` et `$27`) par l'utilisateur ne provoque pas d'exception du MIPS. Toutefois, si le noyau est appelé alors il modifie ces registres et donc l'utilisateur perd leur valeur.\\Le code assembleur ci-après contient les instructions exécutées à l'entrée dans le noyau, quelle que soit la cause. Les commentaires présents dans le code ont été volontairement retirés (ils sont dans le cours et dans les fichiers du TP). La section `.kentry` est placée à l'adresse `0x80000000` par l'éditeur de lien, conformément à ce qui est demandé dans son fichier ldscript `kernel.ld`.\\ \\**`kernel/hcpua.S`**
    264264{{{#!c
    265265 15 .section    .kentry,"ax"     
     
    284284''
    285285- Commentaire du code
    286   - Ligne 25 : `$26` **←**  `c0_cause`\\⟶ donc le registre `$26`GPR réservé au kernel prend la valeur du registre de cause.
    287   - Ligne 26 : `$26` **←**  `$26 & 0b00111100`\\⟶ C'est un masque qui permet de ne conserver que les 4 bits du champ `XCODE`.
    288   - 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`.
    289   - Ligne 28 : si `$26` ≠ `$27` goto kpanic\\⟶ Si ce n'est pas un `syscall`, on va plus loin, sinon on continue en séquence.
    290 ''
    291 }}}
    292 1. Le gestionnaire de `syscall` est la partie du code noyau 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/hcpua.S` que nous allons détailler. 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` du code assembleur sont chargées d'allouer de la place dans la pile.\\ \\**`common/syscalls.h`**
     286  - Ligne 25 : `$26` **←**  `c0_cause`\\⟶ donc le registre GPR `$26`réservé au kernel prend la valeur du registre de cause.
     287  - Ligne 26 : `$26` **←**  `$26 & 0b00.1111.00`\\⟶ C'est un masque qui permet de ne conserver que les 4 bits du champ `XCODE`.
     288  - Ligne 27 : `$27` **←**  `0b 00.1000.00`\\⟶ On initialise le registre GPR réservé au kernel $27 avec la valeur attendue dans $26 s'il s'agit d'une cause `syscall`.
     289  - Ligne 28 : si `$26` ≠ `$27` goto 'kpanic'\\⟶ Si ce n'est pas un `syscall`, on va à la fonction `kpanic`, sinon on continue en séquence.
     290''
     291}}}
     2921. Le gestionnaire de `syscall` est la partie du code noyau qui gère l'exécution des services demandés par l'instruction `syscall`.\\Pour ce noyau, c'est un code en assembleur présent dans le fichier `kernel/hcpua.S` que nous allons détailler.\\Pour vous aider dans la compréhension du code, vous devez vous souvenir que l'instruction `syscall` réalise un peu un appel de fonction:\\- la fonction est définie par un ''numéro de syscall'' contenu dans le registre GPR `$2`;\\- les arguments (4 au maximum) sont dans les registres $4 à $7;\\- la fonction appelante de syscall n'a pas réservé d'espace dans la pile pour les arguments (il faudra le faire);\\- le registre `$2` contient la valeur de retour du syscall.\\ \\Le numéro contenu dans le registre `$2` est utilisé par le noyau pour indexer un tableau de pointeurs de fonctions de ''syscall'' nommé `syscall_vector[]`, ou vecteur de syscalls en français. Ce vecteur de syscalls est défini dans le fichier `kernel/ksyscalls.c`.\\Les lignes `36` à `43` du code assembleur (`kernel/hcpua.S`) sont chargées d'allouer de la place dans la pile, nous allons voir pourquoi...\\ \\**`common/syscalls.h`**
    293293{{{#!c
    294294  1 #define SYSCALL_EXIT        0