Changes between Version 32 and Version 33 of SoclibCourseTp3
- Timestamp:
- Oct 4, 2009, 1:37:02 PM (15 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
SoclibCourseTp3
v32 v33 101 101 102 102 Cette 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.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. 104 104 De 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. 105 105 106 Vous pouvez consulter le fichier `Makefile`pour avoir la liste de tous les106 Vous pouvez consulter le fichier ''Makefile'' pour avoir la liste de tous les 107 107 fichiers objets qui doivent être compilés pour générer le simulateur de cette architecture très simple. 108 108 109 Elle contient également un sous-répertoire `soft`qui est utilisé pour la génération du logiciel embarqué.109 Elle contient également un sous-répertoire ''soft'' qui est utilisé pour la génération du logiciel embarqué. 110 110 111 111 == 4.1 Segmentation de l'espace adressable == … … 124 124 125 125 '''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 129 Complêtez les fichiers ''tp3_top.cpp'' et ''soft/ldsript'' pour définir les adresses de base et les longueurs des segments, 130 130 ainsi que le nombre de terminaux utilisés. 131 131 132 132 == 4.2 Compilation du logiciel embarqué == 133 133 134 Le logiciel embarqué est défini dans plusieurs fichiers source, que vous trouverez dans le répertoire `soft`.134 Le logiciel embarqué est défini dans plusieurs fichiers source, que vous trouverez dans le répertoire ''soft''. 135 135 Certains 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é. 143 143 144 144 '''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 ? 145 145 146 On rappelle que l'instruction `eret`de sortie du GIET ou du code de boot effectue principalemnt deux actions :146 On rappelle que l'instruction ''eret'' de sortie du GIET ou du code de boot effectue principalemnt deux actions : 147 147 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. 148 148 1. Elle effectue un branchement à l'adresse contenue dans le registre protégé EPC (registre 14 du coprocesseur ''système''). … … 150 150 '''Question''' : Quelles sont les initialisations réalisées par le code de boot ? pouquoi ces initialisations ? 151 151 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. 152 Le 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 156 Lancez l'exécution du Makefile. Deux fichiers ''soft.bin'' et ''soft.bin.txt'' doivent être créés dans le répertoire ''soft'' : 157 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. 159 158 160 159 == 4.3 Définition de l'architecture matérielle == 161 160 162 Complétez le fichier `tp3_top.cpp`: Il faut enregister les 7 segments dans la `MappingTable`.161 Complétez le fichier ''tp3_top.cpp'': Il faut enregister les 7 segments dans la ''MappingTable''. 163 162 Il 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 RAM165 d'accéder au fichier `soft/bin.soft`contenant le code binaire.163 leurs paramètres template. Il faut définir le nom du fichier permettant au ''loader'' des composants ROM et RAM 164 d'accéder au fichier ''soft/bin.soft'' contenant le code binaire. 166 165 167 166 '''Question''' : Parmi les 7 segments utilisés dans cette l'architecture, lesquels doivent être déclarés cachables ? 168 167 169 168 '''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`.169 pour déterminer la cible VCI désignée ? Cette information est un des arguments du constructeur de la ''MappingTable''. 171 170 172 171 '''Question''' quels sont les bits d'adresse qui doivent être décodés par le contrôleur du cache, pour déterminer 173 172 qu'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:173 Cette information est un autre argument du constructeur de la ''MappingTable''. 174 175 Remarquez que, pour vous épargner un travail fastidieux, on a déjà modifié les fichiers ''.cpp'' de tous les 176 composants qui dépendent de VCI (c'est à dire presque tous) pour préciser les valeurs des paramètres template : 178 177 179 178 {{{ … … 181 180 }}} 182 181 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 182 Lancez 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 186 Lancez la simulation avec la commande : 187 {{{ 188 $ ./simulator.x 192 189 }}} 193 190 … … 202 199 203 200 Pour 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. 205 202 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. 206 203 … … 208 205 209 206 Puisque 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`.207 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''. 211 208 212 209 On 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 : 210 simplement en modifiant le fichier ''main.c'' dans le répertoire ''soft'', et en relançant la compilation et la génération 211 du fichier ''bin.soft''. 212 213 Modifiez le fichier `main.c`, pour que les programme C exécute une boucle infinie dans laquelle on effectue successivement les opérations suivantes : 218 214 219 215 1. affichage du numéro de cycle et du numéro d'itération. … … 225 221 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. 226 222 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()`.223 Pour afficher sur le terminal, on utilisera évidemment la fonction ''tty_printf()''. 224 Pour obtenir le numéro de cycle, on utilisera la fonction ''proctime()''. 225 Pour la génération aléatoire, on utilisera la fonction ''rand()''. 230 226 Pour les accès au coprocesseur GCD on utilisera les fonctions ''spécifiques'' au coprocesseur GCD. 231 227 232 228 Pour 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 programme229 un appel à la fonction ''tty_getc()'' qui lit un caractère au clavier, et bloque l'exécution du programme 234 230 tant que le caractère n'est pas saisi. 235 231 236 Le code de ces fonctions est défini dans le fichier `stdio.c`, et les prototypes237 sont définis dans le fichier `stdio.h`.232 Le code de ces fonctions est défini dans le fichier ''stdio.c'', et les prototypes 233 sont définis dans le fichier ''stdio.h''. 238 234 239 235 = 5 Compte-rendu =