Changes between Version 34 and Version 35 of Archi-1-TD10
- Timestamp:
- Nov 17, 2023, 1:02:24 PM (12 months ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
Archi-1-TD10
v34 v35 381 381 382 382 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.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 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. 384 384 385 385 … … 387 387 388 388 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)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) 390 390 {{{#!protected ------------------------------------------------------------------------------------ 391 391 '' … … 440 440 19 extern volatile struct tty_s __tty_regs_map[NTTYS]; 441 441 }}} 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 '' 446 451 - `extern` : informe le compilateur que la variable définie existe ailleurs. Grâce à son type, le compilateur sait s'en servir. 447 452 - `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. … … 483 488 }}} 484 489 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` 486 491 {{{#!c 487 492 1 // int syscall (int a0, int a1, int a2, int a3, int syscall_code) … … 494 499 8 ); 495 500 }}} 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()`.\\ 500 505 Aurait-il été possible de mettre le code de la fonction `syscall()` dans un fichier `.S` ? (C10 S31) 501 506 {{{#!protected ------------------------------------------------------------------------------------ … … 512 517 513 518 514 = 4. Génération du code exécutable 519 = 4. Génération du code exécutable (optionnel) 515 520 516 521 … … 528 533 '' 529 534 - 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'é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)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 }}} 538 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'é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) 534 539 {{{#!make 535 540 kernel.x : kernel.ld obj/hcpua.o obj/kinit.o obj/klibc.o obj/harch.o