Changes between Version 33 and Version 34 of Archi-1-TD10
- Timestamp:
- Nov 17, 2023, 12:32:42 PM (19 months ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
Archi-1-TD10
v33 v34 290 290 '' 291 291 }}} 292 1. 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`**292 1. 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:\\- sauf que la fonction est définie par un ''numéro de syscall'' contenu dans le registre GPR `$2`;\\- les arguments sont bien dans les registres $4 à $7, mais il y en a 4 au maximum;\\- toutefois, la fonction appelante de syscall n'a pas réservé d'espace dans la pile pour les arguments, il faudra le faire;\\- enfin, 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`** 293 293 {{{#!c 294 294 1 #define SYSCALL_EXIT 0 … … 359 359 $29 → | | place réservée pour le 1e argument actuellement dans $4 360 360 +----------+ 361 }}} X361 }}} 362 362 - 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. 363 363 - ''Notez qu'interdire les interruptions pendant l'exécution des syscall est un choix important. Pour le moment, ce n'est pas un problème puisque nous ne traitons pas les interruptions, mais si nous les traitions, elles seraient masquées. En conséquence, il serait 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 serait figé (plus rien ne bougerait). Nous verrons comment faire au prochain cours.''\\ \\