Changes between Version 32 and Version 33 of SoclibCourseTp3


Ignore:
Timestamp:
Oct 4, 2009, 1:37:02 PM (15 years ago)
Author:
alain
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • SoclibCourseTp3

    v32 v33  
    101101
    102102Cette archive contient un très grand nombre de fichiers, car les composants matériels instanc!és sont des objets complexes,
    103 qui font appel à beaucoup de code ''caché'' : Par exemple, le chargement initial  des mémoires embarquées ROM et RAM nécessite l'analyse du format de fichier binaire ELF.
     103qui font appel à beaucoup de code caché : Par exemple, le chargement initial  des mémoires embarquées ROM et RAM nécessite l'analyse du format de fichier binaire ELF.
    104104De même, l'utilisation d'un contrôleur de terminal suppose l'ouverture d'une ou plusieurs fenêtres XTERM sur la station de travail qui exécute la simulation.
    105105
    106 Vous pouvez consulter le fichier `Makefile` pour avoir la liste de tous les
     106Vous pouvez consulter le fichier ''Makefile'' pour avoir la liste de tous les
    107107fichiers objets qui doivent être compilés pour générer le simulateur de cette architecture très simple.
    108108
    109 Elle contient également un sous-répertoire `soft` qui est utilisé pour la génération du logiciel embarqué.
     109Elle contient également un sous-répertoire ''soft'' qui est utilisé pour la génération du logiciel embarqué.
    110110
    111111== 4.1 Segmentation de l'espace adressable ==
     
    124124
    125125'''Remarque importante''' : Certaines informations sont utilisées à la fois par le matériel et par le logiciel embarqué. Elles doivent donc être définies dans le fichier ''tp3_top.cpp'' (pour le matériel) et dans le fichier ''soft/ldscript'' (pour le logiciel) :
    126  1. Les addresses de base et les longueurs des segments sont utilisées par le matériel : Elles doivent être définies dans le fichier `tp3_top.cpp` pour ëtre stockées dans la `MappingTable`. Elles sont utilisées dans la phase de configuration du matériel par les constructeurs des composants. Ces mêmes adresses de base des segments sont utilisées par le logiciel et doivent être définies dans le fichier `soft/ldscript` qui contient les directives pour l'éditeur de liens lors de la compilation du logiciel embarqué.
    127  1. Le composant matériel générique `VciMultiTty` peut contrôler un nombre variable de terminaux. Ce nombre de terminaux doit être défini dans le fichier `tp3_top.cpp` décrivant l'architecture matérielle, mais doit aussi être défini dans le  fichier `soft/ldscript`, pour informer le système d'exploitation du nombre de terminaux adressables.
    128 
    129 Complêtez les fichiers `tp3_top.cpp` et `soft/ldsript` pour définir les adresses de base et les longueurs des segments,
     126 1. Les addresses de base et les longueurs des segments sont utilisées par le matériel : Elles doivent être définies dans le fichier ''tp3_top.cpp'' pour ëtre stockées dans la ''MappingTable''. Elles sont utilisées dans la phase de configuration du matériel par les constructeurs des composants. Ces mêmes adresses de base des segments sont utilisées par le logiciel et doivent être définies dans le fichier ''soft/ldscript'' qui contient les directives pour l'éditeur de liens lors de la compilation du logiciel embarqué.
     127 1. Le composant matériel générique ''VciMultiTty'' peut contrôler un nombre variable de terminaux. Ce nombre de terminaux doit être défini dans le fichier ''tp3_top.cpp'' décrivant l'architecture matérielle, mais doit aussi être défini dans le  fichier ''soft/ldscript'', pour informer le système d'exploitation du nombre de terminaux adressables.
     128
     129Complêtez les fichiers ''tp3_top.cpp'' et ''soft/ldsript'' pour définir les adresses de base et les longueurs des segments,
    130130ainsi que le nombre de terminaux utilisés.
    131131
    132132== 4.2 Compilation du logiciel embarqué ==
    133133
    134 Le logiciel embarqué est défini dans plusieurs fichiers source, que vous trouverez dans le répertoire `soft`.
     134Le logiciel embarqué est défini dans plusieurs fichiers source, que vous trouverez dans le répertoire ''soft''.
    135135Certains de ces fichiers sont écrits en assembleur Mips32, certains sont écrits en C :
    136  * le fichier `reset.s` est écrit en assembleur et contient le code de boot qui est exécuté à la mise sous tension, ou lors de l'activation du signal NRESET. Ce code s'exécute en mode ''kernel'' et initialise quelques registres, avant de se brancher à la pemière instruction du programme ''main'', et en forçant le processeur à passer en mode ''user'' gràce à l'instruction ''eret''.
    137  * le fichier `giet.s` est écrit en assembleur et contient le code du Gestionnaire d'Interruption, Exceptions et Trappes. Le GIET est l'unique point d'entrée dans le système d'exploitation. Ce code s'exécute en mode ''kernel'', et se termine toujours par une instruction `eret`.
    138  * le fichier `stdio.c` est écrit en C, et contient le code des fonctions C permettant à un programme applicatif s'exécutant en mode ''user'' d'accéder aux périphériques ''mappés'' dans le segment ''kernel'', en effectuant des appels système.
    139  * le fichier `syscalls.s` est écrit en C et contient le code des appels systèmes proprement dits. Ce code s'exécute en mode kernel, et permet l'accès aux périphériques ou aux registres protégés du processeur.
    140  * le fichier `main.c` est écrit en C et contient le code de l'application logicielle, qui peut évidemment utiliser les fonctions définies dans le fichier `stdio.c`.
    141  * le fichier `ldscript` contient les directives pour l'éditeur de liens.
    142  * le fichier `Makefile` permet de lancer la génération du logiciel embarqué.
     136 * le fichier '''reset.s''' est écrit en assembleur et contient le code de boot qui est exécuté à la mise sous tension, ou lors de l'activation du signal NRESET. Ce code s'exécute en mode ''kernel'' et initialise quelques registres, avant de se brancher à la pemière instruction du programme ''main'', et en forçant le processeur à passer en mode ''user'' gràce à l'instruction ''eret''.
     137 * le fichier '''giet.s''' est écrit en assembleur et contient le code du Gestionnaire d'Interruption, Exceptions et Trappes. Le GIET est l'unique point d'entrée dans le système d'exploitation. Ce code s'exécute en mode ''kernel'', et se termine toujours par une instruction ''eret''.
     138 * le fichier '''stdio.c''' est écrit en C, et contient le code des fonctions C permettant à un programme applicatif s'exécutant en mode ''user'' d'accéder aux périphériques ''mappés'' dans le segment ''kernel'', en effectuant des appels système.
     139 * le fichier '''syscalls.s''' est écrit en C et contient le code des appels systèmes proprement dits. Ce code s'exécute en mode kernel, et permet l'accès aux périphériques ou aux registres protégés du processeur.
     140 * le fichier '''main.c''' est écrit en C et contient le code de l'application logicielle, qui peut évidemment utiliser les fonctions définies dans le fichier ''stdio.c''.
     141 * le fichier '''ldscript''' contient les directives pour l'éditeur de liens, et en particulier les adresses de base des différents segments.
     142 * le fichier '''Makefile''' permet de lancer la génération du logiciel embarqué.
    143143
    144144'''Question''' : Quels sont les appels système qui permettent d'accéder à un terminal TTY ? Lorsqu'il y a plusieurs terminaux dans l'architecture, comment est sélectionné le terminal cible ?
    145145
    146 On rappelle que l'instruction `eret` de sortie du GIET ou du code de boot effectue principalemnt deux actions :
     146On rappelle que l'instruction ''eret'' de sortie du GIET ou du code de boot effectue principalemnt deux actions :
    147147 1. Elle modifie le registre protégé SR (registre 12 du coprocesseur ''système'') pour que le processeur retourne dans le mode où il était lorsqu'il a été dérouté par une interruption, une exception ou un appel système.
    148148 1. Elle effectue un branchement à l'adresse contenue dans le registre protégé EPC (registre 14 du coprocesseur ''système'').
     
    150150'''Question''' : Quelles sont les initialisations réalisées par le code de boot ? pouquoi ces initialisations ?
    151151
    152 Le premier programme que vous allez exécuter se contente d'afficher le célèbre message ''Hello World!'' sur le terminal.
    153 Ouvrez le fichier `soft/main.c`.
    154 
    155 '''Question''' : Que fait ce programme ? (on rappelle que la fonction `tty_getc()` est bloquante, et ne rend pas la main  tant qu'un caractère n'a pas été saisi au clavier).
    156 
    157 Lancez l'exécution du Makefile. Deux fichiers `soft.bin` et `soft.bin.txt` doivent  être créés dans le répertoire `soft` :
    158 Le fichier `soft.bin` contient le code binaire au format ELF, et le fichier `soft.bin.txt` contient un version desassemblée (donc lisible) de ce code binaire.
     152Le premier programme que vous allez exécuter se contente d'afficher le célèbre message ''Hello World! '' sur le terminal. Ouvrez le fichier ''soft/main.c''.
     153
     154'''Question''' : Que fait ce programme ? (on rappelle que la fonction ''tty_getc()'' est bloquante, et ne rend pas la main  tant qu'un caractère n'a pas été saisi au clavier).
     155
     156Lancez l'exécution du Makefile. Deux fichiers ''soft.bin'' et ''soft.bin.txt'' doivent  être créés dans le répertoire ''soft'' :
     157Le fichier ''soft.bin'' contient le code binaire au format ELF, et le fichier ''soft.bin.txt'' contient un version desassemblée (donc lisible) de ce code binaire.
    159158
    160159== 4.3 Définition de l'architecture matérielle ==
    161160
    162 Complétez le fichier `tp3_top.cpp`: Il faut enregister les 7 segments dans la `MappingTable`.
     161Complétez le fichier ''tp3_top.cpp'': Il faut enregister les 7 segments dans la ''MappingTable''.
    163162Il faut définir les arguments de tous les constructeurs des composants instanciés, ainsi que les valeurs de
    164 leurs paramètres template. Il faut définir le nom du fichier permettant au `loader` des composants ROM et RAM
    165 d'accéder au fichier `soft/bin.soft` contenant le code binaire.
     163leurs paramètres template. Il faut définir le nom du fichier permettant au ''loader'' des composants ROM et RAM
     164d'accéder au fichier ''soft/bin.soft'' contenant le code binaire.
    166165
    167166'''Question''' : Parmi les 7 segments utilisés dans cette l'architecture, lesquels doivent être déclarés cachables ?
    168167
    169168'''Question''' : Quel est le nombre de bits de poids fort de l'adresse qui doivent être décodés par le contrôleur du bus
    170 pour déterminer la cible VCI désignée ? Cette information est un des arguments du constructeur de la `MappingTable`.
     169pour déterminer la cible VCI désignée ? Cette information est un des arguments du constructeur de la ''MappingTable''.
    171170
    172171'''Question''' quels sont les bits d'adresse qui doivent être décodés par le contrôleur du cache, pour déterminer
    173172qu'une adresse appartient à un segment non-cachable, et doit être directement transmise à la mémoire ?
    174 Cette information est un autre argument du constructeur de la `MappingTable`.
    175 
    176 Enfin, comme dans le TP2, il faut modifier tous les fichiers des composants SoCLib qui possèdent des paramètres templates pour définir  les valeurs de ces paramètres avant de générer le fichier objet correspondant.
    177 Dans le cas du coprocesseur GCD, il faut modifier le fichier `vci_gcd_coprocessor.cpp` en ajoutant :
     173Cette information est un autre argument du constructeur de la ''MappingTable''.
     174
     175Remarquez que, pour vous épargner un travail fastidieux, on a déjà modifié les fichiers ''.cpp'' de tous les
     176composants qui dépendent de VCI (c'est à dire presque tous) pour préciser les valeurs des paramètres template :
    178177
    179178{{{
     
    181180}}}
    182181
    183 Il faut faire de même pour les autres composants matériels instanciés.
    184 
    185 Quand tout ceci est fait, lancez le Makefile qui vous est fourni dans le répertoire TP3, pour générer le simulateur `simulator.x`.
    186 
    187 == 4.5 Lancement de la simulation ==
    188 
    189 Lancez la simulation en lançant la commande :
    190 {{{
    191 $ ./simulator.x 2000
     182Lancez le Makefile qui vous est fourni dans le répertoire TP3, pour générer le simulateur `simulator.x`.
     183
     184== 4.5 Simulation ==
     185
     186Lancez la simulation avec la commande :
     187{{{
     188$ ./simulator.x
    192189}}}
    193190
     
    202199
    203200Pour attirer votre attention sur des erreurs fréquentes, faites les essais suivants :
    204  1. Modifiez l'adresse de base du segment `seg_gcd` pour lui donner la valeur 0xB0000000 au lieu de 0x9000000. Relancez la compilation et la simulation. Expliquez les résultats obtenus.
     201 1. Modifiez l'adresse de base du segment ''seg_gcd'' pour lui donner la valeur 0xB0000000 au lieu de 0x9000000. Relancez la compilation et la simulation. Expliquez les résultats obtenus.
    205202 1. Déclarez les segments correspondant aux périphériques (seg_tty et seg_gcd) comme cachables. Relancez la compilation et la simulation. Expliquez les résultats obtenus.
    206203 
     
    208205
    209206Puisque le logiciel embarqué est chargé dynamiquement dans la RAM et dans la ROM lors du lancement du simulateur,
    210 il est possible de modifier le logiciel embarqué (fichier `bin.soft`), sans modifier l'architecture matérielle et donc sans regénérer le fichier `simulator.x`.
     207il est possible de modifier le logiciel embarqué (fichier ''bin.soft''), sans modifier l'architecture matérielle et donc sans regénérer le fichier ''simulator.x''.
    211208
    212209On va donc maintenant écrire une application logicielle un peu plus complexe, qui utilise le coprocesseur GCD,
    213 simplement en modifiant le fichier `main.c` dans le répertoire `soft`, et en relançant la compilation et la génération
    214 du fichier `bin.soft`.
    215 
    216 Modifiez le fichier `main.c`, pour que les programme C exécute une boucle infinie dans laquelle on effectue successivement
    217 les opérations suivantes :
     210simplement en modifiant le fichier ''main.c'' dans le répertoire ''soft'', et en relançant la compilation et la génération
     211du fichier ''bin.soft''.
     212
     213Modifiez le fichier `main.c`, pour que les programme C exécute une boucle infinie dans laquelle on effectue successivement les opérations suivantes :
    218214
    219215 1. affichage du numéro de cycle et du numéro d'itération.
     
    225221 1. affichage du numéro d'itération, du numéro de cycle, des valeurs des opérandes et du résultat sur le TTY.
    226222
    227 Pour afficher sur le terminal, on utilisera évidemment la fonction `tty_printf()`.
    228 Pour obtenir le numéro de cycle, on utilisera la fonction `proctime()`.
    229 Pour la génération aléatoire, on utilisera la fonction `rand()`.
     223Pour afficher sur le terminal, on utilisera évidemment la fonction ''tty_printf()''.
     224Pour obtenir le numéro de cycle, on utilisera la fonction ''proctime()''.
     225Pour la génération aléatoire, on utilisera la fonction ''rand()''.
    230226Pour les accès au coprocesseur GCD on utilisera les fonctions ''spécifiques'' au coprocesseur GCD.
    231227
    232228Pour introduire un peu d'interactivité dans cet exercice, vous pouvez introduire dans la boucle
    233 un appel à la fonction `tty_getc()` qui lit un caractère au clavier, et bloque l'exécution du programme
     229un appel à la fonction ''tty_getc()'' qui lit un caractère au clavier, et bloque l'exécution du programme
    234230tant que le caractère n'est pas saisi.
    235231 
    236 Le code de ces fonctions est défini dans le fichier `stdio.c`, et les prototypes
    237 sont définis dans le fichier `stdio.h`.
     232Le code de ces fonctions est défini dans le fichier ''stdio.c'', et les prototypes
     233sont définis dans le fichier ''stdio.h''.
    238234
    239235= 5 Compte-rendu =