Changes between Version 76 and Version 77 of Archi-1-TP9


Ignore:
Timestamp:
Dec 5, 2020, 10:21:53 AM (4 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Archi-1-TP9

    v76 v77  
    99
    1010Cette 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.
     11La 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.
    1212
    1313Avant de faire cette séance, vous devez avoir lu les documents suivants :
     
    6767'''''''''''''''
    6868}}}
    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 ?
     691. 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 ?
    7070{{{#!protected ------------------------------------------------------------------------------------
    7171'''''''''''''''
    7272* 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.
    7474* On accède à l'espace d'adressage avec les instructions load/store (`lw`, `lh`, `lb`, `lhu`, `lbu`, `sw`, `sh`, `sb`).
    7575* 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).
     
    9090'''''''''''''''
    9191}}}
    92 1. Il y a 4 registres dans le contrôleur de `TTY`, a quelles adresses sont-il 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 ?
     921. 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 ?
    9393{{{#!protected ------------------------------------------------------------------------------------
    9494'''''''''''''''
     
    126126{{{#!asm
    127127lui   $4, 0xD020
    128 ori   $4, $4, 0x0000   // cette instruction ne sert a rien puisqu on ajoute 0, mais je la met pour le cas general
     128ori   $4, $4, 0x0000   // cette instruction ne sert a rien puisqu on ajoute 0, mais je la mets pour le cas general
    129129ori   $5, 'x'
    130130sb    $5, ($4)         // Notez que le 0 devant ($4) n est pas obligatoire
     
    163163'''''''''''''''
    164164}}}
    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 section dans le code objet produit par le compilateur avec la directive `.section name,"flags"`
     1651. 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"`
    166166   - `name` est le nom de la nouvelle section on met souvent un `.name` pour montrer que c'est une section et
    167167   - `"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`
    169169{{{#!protected ------------------------------------------------------------------------------------
    170170'''''''''''''''
     
    175175'''''''''''''''
    176176}}}
    177 1. A quoi sert la directive `.globl label` ?
     1771. À quoi sert la directive `.globl label` ?
    178178{{{#!protected ------------------------------------------------------------------------------------
    179179'''''''''''''''
     
    181181'''''''''''''''
    182182}}}
    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.
     1831. É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.
    184184{{{#!protected ------------------------------------------------------------------------------------
    185185'''''''''''''''
     
    251251'''''''''''''''
    252252}}}
    253 1. Comment définir une macro instruction du processeur uniquement si elle n'est pas définie ? Écrivez un exemple.
     2531. Comment définir une macroinstruction du processeur uniquement si elle n'est pas définie ? Écrivez un exemple.
    254254{{{#!protected ------------------------------------------------------------------------------------
    255255'''''''''''''''
     
    265265{{{#!protected ------------------------------------------------------------------------------------
    266266'''''''''''''''
    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.
    268268{{{#!c
    269 ————————————————————— debut du fichier filename.h
     269————————————————————— début du fichier filename.h
    270270#ifndef _FILENAME_H_
    271271#define _FILENAME_H_
     
    441441'''''''''''''''
    442442}}}
    443 1. Ou est 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 !
     4431. 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 !
    447447* `-DNTTYS=$(NTTY)` permet de définir un #define en ligne de commande et donc de changer les sources sans ouvrir les codes.
    448448'''''''''''''''
     
    457457{{{#!protected ------------------------------------------------------------------------------------
    458458'''''''''''''''
    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 ou 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.
     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.
    461461'''''''''''''''
    462462}}}
     
    519519'''''''''''''''
    520520}}}
    521 1. A quelle adresse démarre le MIPS ? Où peut-on le vérifier ?
     5211. À quelle adresse démarre le MIPS ? Où peut-on le vérifier ?
    522522{{{#!protected ------------------------------------------------------------------------------------
    523523'''''''''''''''
     
    604604'''''''''''''''
    605605* 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.
    607607'''''''''''''''
    608608}}}
     
    641641}}}
    6426422. 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éfinit `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 ?
    645645   Pourquoi ne pas avoir utilisé `j init` et donc pourquoi passer par un registre ?
    646646{{{#!protected ------------------------------------------------------------------------------------
     
    740740
    741741Le 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 du
     742de terminaux texte (TTY). Par défaut, il y en a un mais, nous pouvons en avoir jusqu'à 4. Nous allons modifier le code du
    743743noyau pour s'adapter à cette variabilité. En outre, pour le moment, nous ne faisions qu'écrire sur le terminal,
    744744maintenant, nous allons aussi lire le clavier.
     
    806806**Questions**
    807807
    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 messages. 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.
     8081. 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.
    812812'''''''''''''''
    813813}}}
     
    816816'''''''''''''''
    817817* 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.
    819819'''''''''''''''
    820820}}}