Changes between Version 76 and Version 77 of Archi-1-TP9
- Timestamp:
- Dec 5, 2020, 10:21:53 AM (4 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
Archi-1-TP9
v76 v77 9 9 10 10 Cette page décrit la séance complète : TD et TME. Elle commence par des exercices à faire sur papier et puis elle continue et se termine par des questions sur le code et quelques exercices de codage simples à écrire et tester sur le prototype. 11 La partie pratique est découpée en 5 étapes. Pour chaque étape, nous donnons une brève description, suivie d'une liste des objectifs principaux et d'une liste des fichiers présents. Un bref commentaire est ajouté pour les fichiers. Vous avez une liste de questions simple et l'exercice de codage.11 La partie pratique est découpée en 5 étapes. Pour chaque étape, nous donnons une brève description, suivie d'une liste des objectifs principaux et d'une liste des fichiers présents. Un bref commentaire est ajouté pour les fichiers. Vous avez une liste de questions simples et l'exercice de codage. 12 12 13 13 Avant de faire cette séance, vous devez avoir lu les documents suivants : … … 67 67 ''''''''''''''' 68 68 }}} 69 1. Qu'est-ce l'espace d'adressage du MIPS ? Quel taille fait-il ?\\Quelles sont les instructions du MIPS permettant d'utiliser ces adresses ? Est-ce synonyme de mémoire ?69 1. Qu'est-ce l'espace d'adressage du MIPS ? Quelle taille fait-il ?\\Quelles sont les instructions du MIPS permettant d'utiliser ces adresses ? Est-ce synonyme de mémoire ? 70 70 {{{#!protected ------------------------------------------------------------------------------------ 71 71 ''''''''''''''' 72 72 * L'espace d'adressage du MIPS est l'ensemble des adresses que peut former le MIPS. 73 * Les adresses sont sur 32 bits qui désigne chacune un octet, il y a donc 2^32^ octets.73 * Les adresses sont sur 32 bits qui désignent chacune un octet, il y a donc 2^32^ octets. 74 74 * On accède à l'espace d'adressage avec les instructions load/store (`lw`, `lh`, `lb`, `lhu`, `lbu`, `sw`, `sh`, `sb`). 75 75 * Non, les mémoires sont des composants contenant des cases de mémoire adressable. Les mémoires sont placées (on dit aussi « ''mappées'' » dans l'espace d'adressage). … … 90 90 ''''''''''''''' 91 91 }}} 92 1. Il y a 4 registres dans le contrôleur de `TTY`, a quelles adresses sont-ilplacés dans l'espace d'adressage ?\\Comme ce sont des registres, est-ce que le MIPS peut les utiliser comme opérandes pour ses instructions (comme add, or, etc.) ?\\Dans quel registre faut-il écrire pour envoyer un caractère sur l'écran du terminal (implicitement à la position du curseur) ?\\Que contiennent les registres `TTY_STATUS` et `TTY_READ` ?\\Quelle est l'adresse de `TTY_WRITE` dans l'espace d'adressage ?92 1. Il y a 4 registres dans le contrôleur de `TTY`, à quelles adresses sont-ils placés dans l'espace d'adressage ?\\Comme ce sont des registres, est-ce que le MIPS peut les utiliser comme opérandes pour ses instructions (comme add, or, etc.) ?\\Dans quel registre faut-il écrire pour envoyer un caractère sur l'écran du terminal (implicitement à la position du curseur) ?\\Que contiennent les registres `TTY_STATUS` et `TTY_READ` ?\\Quelle est l'adresse de `TTY_WRITE` dans l'espace d'adressage ? 93 93 {{{#!protected ------------------------------------------------------------------------------------ 94 94 ''''''''''''''' … … 126 126 {{{#!asm 127 127 lui $4, 0xD020 128 ori $4, $4, 0x0000 // cette instruction ne sert a rien puisqu on ajoute 0, mais je la met pour le cas general128 ori $4, $4, 0x0000 // cette instruction ne sert a rien puisqu on ajoute 0, mais je la mets pour le cas general 129 129 ori $5, 'x' 130 130 sb $5, ($4) // Notez que le 0 devant ($4) n est pas obligatoire … … 163 163 ''''''''''''''' 164 164 }}} 165 1. Vous avez utilisé les directives `.text` et `.data` pour définir les sections où placer les instructions et les variables globales, mais il existe la possibilité de demander la création de nouvelle sectiondans le code objet produit par le compilateur avec la directive `.section name,"flags"`165 1. Vous avez utilisé les directives `.text` et `.data` pour définir les sections où placer les instructions et les variables globales, mais il existe la possibilité de demander la création de nouvelles sections dans le code objet produit par le compilateur avec la directive `.section name,"flags"` 166 166 - `name` est le nom de la nouvelle section on met souvent un `.name` pour montrer que c'est une section et 167 167 - `"flags"` informe du contenu `"ax"` pour des instructions, `"ad"` pour des données (ceux que ça intéresse pourront regarder là [https://frama.link/20UzK0FP]) 168 Écrivez le code assembleur créant la section ".mytext" et suivi de l'addition des registre `$5` et `$6` dans `$4`168 Écrivez le code assembleur créant la section ".mytext" et suivi de l'addition des registres `$5` et `$6` dans `$4` 169 169 {{{#!protected ------------------------------------------------------------------------------------ 170 170 ''''''''''''''' … … 175 175 ''''''''''''''' 176 176 }}} 177 1. Aquoi sert la directive `.globl label` ?177 1. À quoi sert la directive `.globl label` ? 178 178 {{{#!protected ------------------------------------------------------------------------------------ 179 179 ''''''''''''''' … … 181 181 ''''''''''''''' 182 182 }}} 183 1. Ecrivez une séquence de code qui affiche la chaîne de caractère `"Hello"` sur `TTY0`. Ce n'est pas une fonction et vous pouvez utiliser tous les registres que vous voulez. Vous supposez que `__tty_regs_maps` est déjà défini.183 1. Écrivez une séquence de code qui affiche la chaîne de caractère `"Hello"` sur `TTY0`. Ce n'est pas une fonction et vous pouvez utiliser tous les registres que vous voulez. Vous supposez que `__tty_regs_maps` est déjà défini. 184 184 {{{#!protected ------------------------------------------------------------------------------------ 185 185 ''''''''''''''' … … 251 251 ''''''''''''''' 252 252 }}} 253 1. Comment définir une macro 253 1. Comment définir une macroinstruction du processeur uniquement si elle n'est pas définie ? Écrivez un exemple. 254 254 {{{#!protected ------------------------------------------------------------------------------------ 255 255 ''''''''''''''' … … 265 265 {{{#!protected ------------------------------------------------------------------------------------ 266 266 ''''''''''''''' 267 * En utilisant ce que nous venons de voir dans la question précédente. Si vous définissez une macro différente au début de chaque fichier `.h` (en utilisant le nom du fichier comme nom de macro pour éviter les collision de nom) et que vous nous commencer tester que cette variable n'est pas définie comme condition d'inclusion.267 * En utilisant ce que nous venons de voir dans la question précédente. Si vous définissez une macro différente au début de chaque fichier `.h` (en utilisant le nom du fichier comme nom de macro pour éviter les collisions de nom) et que vous nous commencer tester que cette variable n'est pas définie comme condition d'inclusion. 268 268 {{{#!c 269 ————————————————————— d ebut du fichier filename.h269 ————————————————————— début du fichier filename.h 270 270 #ifndef _FILENAME_H_ 271 271 #define _FILENAME_H_ … … 441 441 ''''''''''''''' 442 442 }}} 443 1. O uest utilisé `CFLAGS` ? Que fait `-DNTTYS=$(NTTY)` et pourquoi est-ce utile ici ?444 {{{#!protected ------------------------------------------------------------------------------------ 445 ''''''''''''''' 446 * La variable `CFLAGS` est utilisé par `gcc`, il y a ici toutes les options indispensables pour compiler mais il en existe des tonnes !443 1. Où est utilisé `CFLAGS` ? Que fait `-DNTTYS=$(NTTY)` et pourquoi est-ce utile ici ? 444 {{{#!protected ------------------------------------------------------------------------------------ 445 ''''''''''''''' 446 * La variable `CFLAGS` est utilisée par `gcc`, il y a ici toutes les options indispensables pour compiler mais il en existe des tonnes ! 447 447 * `-DNTTYS=$(NTTY)` permet de définir un #define en ligne de commande et donc de changer les sources sans ouvrir les codes. 448 448 ''''''''''''''' … … 457 457 {{{#!protected ------------------------------------------------------------------------------------ 458 458 ''''''''''''''' 459 * `@` permet de ne pas afficher la commande avant son exécution. On peut rendre ce comportement systématique en ajoutant la règle `.SILENT:` n'importe o udans le fichier.460 * `-` permet de ne pas stopper l'exécution des commandes même si elles rendent une erreur, c'est-à-dire une valeur de sortie différente de 0.459 * `@` permet de ne pas afficher la commande avant son exécution. On peut rendre ce comportement systématique en ajoutant la règle `.SILENT:` n'importe où dans le fichier. 460 * `-` permet de ne pas stopper l'exécution des commandes même si elles rendent une erreur, c'est-à-dire une valeur de sortie différente de 0. 461 461 ''''''''''''''' 462 462 }}} … … 519 519 ''''''''''''''' 520 520 }}} 521 1. Aquelle adresse démarre le MIPS ? Où peut-on le vérifier ?521 1. À quelle adresse démarre le MIPS ? Où peut-on le vérifier ? 522 522 {{{#!protected ------------------------------------------------------------------------------------ 523 523 ''''''''''''''' … … 604 604 ''''''''''''''' 605 605 * Ils doivent dupliquer la boucle d'affichage et le message. Il faut juste faire attention aux labels en en créant des nouveaux. 606 et ils ne peuvent pas utiliser des fonctions parce qu'ils n'ont pas de pile.606 Ils ne peuvent pas utiliser des fonctions parce qu'ils n'ont pas de pile. 607 607 ''''''''''''''' 608 608 }}} … … 641 641 }}} 642 642 2. Le code de boot ne fait que sauter à l'adresse `kinit avec l'instruction `j`, 643 il n'y a pas de retour, ce n'est donc pas un `jal`. Où est défini t`kinit` ?644 Comment le code de boot connait cette adresse ?643 il n'y a pas de retour, ce n'est donc pas un `jal`. Où est défini `kinit` ? 644 Comment le code de boot connait-il cette adresse ? 645 645 Pourquoi ne pas avoir utilisé `j init` et donc pourquoi passer par un registre ? 646 646 {{{#!protected ------------------------------------------------------------------------------------ … … 740 740 741 741 Le prototype de SoC que nous utilisons pour les TP est configurable. Il est possible par exemple de choisir le nombre 742 terminaux texte (TTY). Par défaut, il y en a un mais, nous pouvons en avoir jusqu'à 4. Nous allons modifier le code du742 de terminaux texte (TTY). Par défaut, il y en a un mais, nous pouvons en avoir jusqu'à 4. Nous allons modifier le code du 743 743 noyau pour s'adapter à cette variabilité. En outre, pour le moment, nous ne faisions qu'écrire sur le terminal, 744 744 maintenant, nous allons aussi lire le clavier. … … 806 806 **Questions** 807 807 808 1. Le code du driver du TTY est dans le fichier `harch.c` et les prototypes sont dans `harch.h`. Si vous ouvrez `harch.h` vous allez voir que seul les prototypes des fonctions `tty_read()` et `tty_write()` sont présents. La structure décrivant la carte des registres du `TTY` est déclaré dans le .c. Pourquoi avoir fait ainsi ?809 {{{#!protected ------------------------------------------------------------------------------------ 810 ''''''''''''''' 811 - Le noyau n'a pas besoin de savoir comment sont organisés les registres dans le TTY. Il a juste besoin de savoir comment écrire ou lire un message s. Plus c'est cloisonné, moins il y a de risque de problèmes. En outre, cela simplifie un hypothétique portage sur une autre architecture.808 1. Le code du driver du TTY est dans le fichier `harch.c` et les prototypes sont dans `harch.h`. Si vous ouvrez `harch.h` vous allez voir que seuls les prototypes des fonctions `tty_read()` et `tty_write()` sont présents. La structure décrivant la carte des registres du `TTY` est déclaré dans le .c. Pourquoi avoir fait ainsi ? 809 {{{#!protected ------------------------------------------------------------------------------------ 810 ''''''''''''''' 811 - Le noyau n'a pas besoin de savoir comment sont organisés les registres dans le TTY. Il a juste besoin de savoir comment écrire ou lire un message. Plus c'est cloisonné, moins il y a de risque de problèmes. En outre, cela simplifie un hypothétique portage sur une autre architecture. 812 812 ''''''''''''''' 813 813 }}} … … 816 816 ''''''''''''''' 817 817 * La fonction qui lit ce registre est nécessairement en assembleur, elle est donc mise dans hcpu.S. 818 * `.globl clock` permet de faire en sorte que la fonction soit visible par les autres fichier C.818 * `.globl clock` permet de faire en sorte que la fonction soit visible par les autres fichiers C. 819 819 ''''''''''''''' 820 820 }}}