Changes between Version 34 and Version 35 of Archi-1-TD10


Ignore:
Timestamp:
Nov 17, 2023, 1:02:24 PM (12 months ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Archi-1-TD10

    v34 v35  
    381381
    382382
    383 La programmation en C, vous connaissez, mais quand on programme pour le noyau il y a des éléments de syntaxe ou des besoins spécifiques. Pour répondre aux questions, vous devez avoir lu les transparents de l'annexe du cours 10, dans lesquels une séquence complète de code est détaillée du boot à exit.
     383La programmation en C, vous connaissez, mais quand on programme pour le noyau il y a des éléments de syntaxe ou des besoins spécifiques que vous ne connaissez peut-être pas. Pour répondre aux questions, vous devez avoir lu les transparents de l'annexe du cours 10, dans lesquels une séquence complète de code est détaillée du boot à exit.
    384384
    385385
     
    387387
    388388
    389 1. En assembleur, vous utilisez les sections prédéfinies `.data` et `.text` pour placer respectivement les data et le code, mais vous pouvez créer vos propres sections avec la directive `.section` (nous avons utilisé cette possibilité pour la section `.boot`). Il est aussi possible d'imposer ou de créer des sections en langage C avec la directive `__attribute__((section("section-name")))`. La directive du C `__attribute__` permet de demander certains comportements au compilateur. Ici, c'est la création d'une section, mais il y a beaucoup d'attributs possibles (si cela vous intéresse vous pouvez regarder dans la [https://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Variable-Attributes.html doc de GCC sur les attributs]. Comment créer la section `.start` en C ? (C10 S30 C10 annexe S8)
     3891. En assembleur, vous utilisez les sections prédéfinies `.data` et `.text` pour placer respectivement les ''data'' et le ''code'', mais vous pouvez créer vos propres sections avec la directive `.section` (nous avons utilisé cette possibilité pour la section `.boot`). Il est aussi possible d'imposer ou de créer des sections en langage C avec la directive `__attribute__((section("section-name")))`. La directive du C `__attribute__` permet de demander certains comportements au compilateur. Ici, c'est la création d'une section, mais il y a beaucoup d'attributs possibles (si cela vous intéresse vous pouvez regarder dans la [https://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Variable-Attributes.html doc de GCC sur les attributs]. Comment créer la section `.start` en C ? (C10 S30 C10 annexe S8)
    390390{{{#!protected ------------------------------------------------------------------------------------
    391391''
     
    440440 19 extern volatile struct tty_s __tty_regs_map[NTTYS];
    441441}}}
    442   Si `NTTYS` est une macro dont la valeur est `2`, quelle est l'adresse en mémoire `__tty_regs_map[1].read` ?\\À quoi servent les mots clés `extern` et `volatile` ? (C10 annexe S23 et connaissance du C)
    443 {{{#!protected ------------------------------------------------------------------------------------
    444 ''
    445 - `__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`
     442  Si `NTTYS` est une macro dont la valeur est `2`, quelle est l'adresse en mémoire `__tty_regs_map[1].read` ?
     443{{{#!protected ------------------------------------------------------------------------------------
     444''
     445- `__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 de la structure, c'est un entier, donc en `+8` par rapport au début de la strucrure.\\En conséquence `__tty_regs_map[1].read` est en `0xd0200018`
     446''
     447}}}
     448 À quoi servent les mots clés `extern` et `volatile` ? (C10 annexe S23 et connaissance du C)
     449{{{#!protected ------------------------------------------------------------------------------------
     450''
    446451- `extern` : informe le compilateur que la variable définie existe ailleurs. Grâce à son type, le compilateur sait s'en servir.
    447452- `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.
     
    483488}}}
    484489 
    485  Le code de cette fonction est dans le fichier `tp2/4_libc/ulib/crt0.c`
     490 Le code de la fonction `syscall()` en **assembleur** est dans le fichier **C** : `tp2/4_libc/ulib/crt0.c`
    486491{{{#!c
    487492  1 // int syscall (int a0, int a1, int a2, int a3, int syscall_code)
     
    494499  8 );
    495500}}}
    496  Combien d'arguments a la fonction `syscall()`?
    497  Comment la fonction `syscall()` reçoit-elle ses arguments ?
    498  A quoi sert la ligne 3 de la fonction `syscall()` et que se passe-t-il si on la retire ?
    499  Expliquer la ligne 5 de la fonction `syscall()`.
     501 Combien d'arguments a la fonction `syscall()`?\\
     502 Comment la fonction `syscall()` reçoit-elle ses arguments ?\\
     503 A quoi sert la ligne 3 de la fonction `syscall()` et que se passe-t-il si on la retire ?\\
     504 Expliquer la ligne 5 de la fonction `syscall()`.\\
    500505 Aurait-il été possible de mettre le code de la fonction `syscall()` dans un fichier `.S` ? (C10 S31)
    501506{{{#!protected ------------------------------------------------------------------------------------
     
    512517
    513518
    514 = 4. Génération du code exécutable
     519= 4. Génération du code exécutable (optionnel)
    515520
    516521
     
    528533''
    529534- Le rôle principal d'un Makefile est de décrire le mode d'emploi pour construire un fichier dit **`cible`** à partir d'un ou plusieurs fichiers **`source`** (dits de dépendance) en utilisant des commandes du `shell`. Ce rôle pourrait tout aussi bien être occupé par un script `shell` et d'ailleurs, dans le premier TP, nous avons vu un usage du Makefile dans lequel nous avions rassemblé plusieurs scripts `shell` sous forme de règles.
    530 - Le second rôle d'un Makefile est de permettre la reconstruction partielle du fichier **`cible`** lorsque quelques fichiers **`source`** changent (pas tous). Pour ce rôle, le Makefile exprime toutes les étapes de construction de la **`cible`** finale et des **`cibles`** intermédiaires sous forme d'un arbre dont les feuilles sont les fichiers **`sources`**.
    531 ''
    532 }}}
    533 1. Vous n'allez pas à avoir à écrire un Makefile complètement. Toutefois, si vous ajoutez des fichiers source, vous allez devoir les modifier en ajoutant des règles. Nous avons vu brièvement la syntaxe utilisée dans les Makefiles de ce TP. Les lignes qui suivent sont des extraits de `1_klibc/Makefile` (le Makefile de l'étape1). Dans cet extrait, quelles sont la `cible` finale, les `cibles` intermédiaires et les `sources`? A quoi servent les variables automatiques de make? Dans ces deux règles, donnez-en la valeur. (C9 annexe S5 à S7)
     535- Le second rôle d'un Makefile est de permettre la reconstruction partielle du fichier **`cible`** lorsque quelques fichiers **`source`** changent (pas tous). Pour ce rôle, le Makefile exprime toutes les étapes de construction de la **`cible`** finale et des **`cibles`** intermédiaires sous forme d'un arbre dont les feuilles sont les fichiers **`sources`**. Les commandes d'une règle ne sont exécutées que si la date de la cible est plus ancienne que la date de l'une des sources dont elle dépend.
     536''
     537}}}
     5381. Vous n'allez pas à avoir à écrire un Makefile complètement. Toutefois, si vous ajoutez des fichiers source, vous allez devoir les modifier en ajoutant des règles. Nous avons vu brièvement la syntaxe utilisée dans les Makefiles de ce TP. Les lignes qui suivent sont des extraits de `1_klibc/Makefile` (le Makefile de l'étape-1). Dans cet extrait, quelles sont la `cible` finale, les `cibles` intermédiaires et les `sources`? A quoi servent les variables automatiques de make? Dans ces deux règles, donnez-en la valeur. (C9 annexe S5 à S7)
    534539{{{#!make
    535540kernel.x : kernel.ld obj/hcpua.o obj/kinit.o obj/klibc.o obj/harch.o