Changes between Version 89 and Version 90 of Archi-1-TP10


Ignore:
Timestamp:
Nov 24, 2021, 5:29:08 PM (3 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Archi-1-TP10

    v89 v90  
    198198
    199199La programmation en C, vous connaissez, mais quand on programme pour le noyau, c'est un peu différent.
    200 Il y a des éléments de syntaxe ou des besoins spécifiques.
     200Il y a des éléments de syntaxe ou des besoins spécifiques. Pour répondre aux questions, vous devez avoir lu les transparents 33 à 53 du cours 10, dans lesquels une séquence complète de code (du boot à exit) est détaillée.
    201201
    202202
     
    264264- `extern` : informe le compilateur que la variable définie existe ailleurs. Grâce à son type, le compilateur sait s'en servir.
    265265- `volatile` : informe le compilateur que la variable peut changer de valeur toute seule et que donc il doit toujours accéder en mémoire à chaque fois que le programme le demande. Il ne peut donc pas optimiser les accès mémoire en utilisant les registres.
    266 - `__tty_regs_map` est un tableau à 2 cases (puisque `NTTYS`=`2`). Chaque case est une structure de 4 entiers, donc `0x10` octets.\\`read` est le troisième champ, c'est le troisième entier de la structure, donc en `+8` par rapport au début.\\En conséquence `__tty_regs_map[1].read` est en `0xd0200018`
     266- `__tty_regs_map` est un tableau à 2 cases (puisque `NTTYS`=`2`).\\Chaque case est une structure de 4 entiers, donc `0x10` octets (16 octets).\\`read` est le troisième champ, c'est le troisième entier de la structure, donc en `+8` par rapport au début.\\En conséquence `__tty_regs_map[1].read` est en `0xd0200018`
    267267''
    268268}}}
    2692691. Certaines parties du noyau sont en assembleur. Il y a au moins les toutes premières instructions du code de boot (démarrage de l'ordinateur) et l'entrée dans le noyau (kentry) après l'exécution d'un syscall. Le gestionnaire de syscall est écrit en assembleur et il a besoin d'appeler une fonction écrite en langage C. Ce que fait le gestionnaire de syscall est:
    270270 - trouver l'adresse de la fonction C qu'il doit appeler pour exécuter le service demandé;
    271  - placer cette adresse dans un registre, par exemple `$2`;
     271 - placer cette adresse dans un registre, nous utilisons le registre `$2`;
    272272 - exécuter l'instruction `jal` (ici, `jal $2`) pour appeler la fonction.
    273273
    274  Que doivent contenir les registres `$4` à `$7` et comment doit-être la pile?
    275 {{{#!protected ------------------------------------------------------------------------------------
    276 '''''''''''''''
     274 Que doivent contenir les registres `$4` à `$7` et comment doit-être la pile et le pointeur de pile?
     275{{{#!protected ------------------------------------------------------------------------------------
     276''
     277Cours 10 / slide 42
    277278- C'est un appel de fonction, il faut donc respecter la convention d'appel des fonctions
    278279  - Les registres `$4`à `$7` contiennent les arguments de la fonction
    279   - Le pointeur de pile doit pointer sur la case réservée pour le premier argument et les cases suivantes sont réservées
    280     arguments suivants.
    281   - Ce n'est pas rappelé ici, mais il y a **au plus** 4 arguments (entier ou pointeur) pour tous les syscalls.
    282     En conséquence, le pointeur de pile pointe au début d'une zone vide de 4 entiers.
    283 '''''''''''''''
     280  - Le pointeur de pile doit pointer sur la case réservée pour le premier argument et les cases suivantes sont réservées arguments suivants.
     281  - Ce n'est pas rappelé ici, mais, **pour l'application user**, il y a **au plus** 4 arguments (entier ou pointeur) pour tous les syscalls. Le gestionnaire de syscall ajoute un cinquième argument avec le numéro de service qu'il a reçu dans `$2`. En conséquence, le pointeur de pile pointe au début d'une zone vide de 4 entiers suivi d'un 5e avec le numéro du service.
     282  - L'intérêt d'ajouter le numéro de service comme cinquième argument, c'est qu'il est possible de faire une fonction unique qui gère un ensemble de syscalls avec un `switch/case` sur le numéro de service. On ne le fait pas dans cette version.
     283''
    284284}}}
    2852855. Vous avez appris à écrire des programmes assembleur, mais parfois il est plus simple, voire nécessaire, de mélanger le code C et le code assembleur. Dans l'exemple ci-dessous, nous voyons comment la fonction `syscall()` est écrite. Cette fonction utilise l'instruction `syscall`.\\Deux exemples d'usage de la fonction `syscall()` pris dans le fichier `tp2/4_libc/ulib/libc.c`
     
    292292  6     va_start (ap, fmt);
    293293  7     res = vsnprintf(buffer, sizeof(buffer), fmt, ap);
    294   8     res = syscall( tty, (int)buffer, 0, 0, SYSCALL_TTY_PUTS);
     294  8     res = syscall (tty, (int)buffer, 0, 0, SYSCALL_TTY_PUTS);
    295295  9     va_end(ap);
    296296 10     return res;
     
    320320 Aurait-il été possible de mettre le code de la fonction `syscall()` dans un fichier `.S` ?
    321321{{{#!protected ------------------------------------------------------------------------------------
    322 '''''''''''''''
     322''
     323Cours 10 / slide 40
    323324- La fonction `syscall()` a 5 a arguments
    324325- Elle reçoit ses 4 premiers arguments dans les registres $4 à $7 et le 5e dans la pile.
    325 - 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 le linker.
     326- 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.
    326327- Le noyau attend le numéro de service dans `$2`. Or le numéro du service est le 5e arguments de la fonction `syscall()`. La ligne 5 permet d'aller le chercher dans la pile.
    327 '''''''''''''''
     328''
    328329}}}
    329330