40 | | VciXcacheWrapper<vci_param, GdbServer<Mips32ElIss> > cpu0("cpu0", ...); |
41 | | }}} |
42 | | |
43 | | Le GDB server est donc un pseudo-composant matériel, qui s'interface entre le processeur et le cache. |
44 | | En prenant le contrôle du GDB Server (par l'intermédiaire du client GDB), on peut donc contrôler le processeur |
45 | | (pour le faire fonctionnner en pas à pas par exemple), et on peut également contrôler le reste du système |
46 | | (en effectuant directement des commandes de lecture ou d'écriture vers la mémoire). |
| 40 | VciXcacheWrapper<vci_param, GdbServer<Mips32ElIss> > proc("proc", ...); |
| 41 | }}} |
| 42 | |
| 43 | Le GDB server est un pseudo-composant matériel, qui s'interface entre le processeur et le cache. |
| 44 | En prenant le contrôle du GDB Server (par l'intermédiaire du client GDB), on peut donc faire deux choses : |
| 45 | * contrôler le processeur (pour le faire fonctionnner en pas à pas par exemple), |
| 46 | * contrôler le reste du système (en effectuant directement des commandes de lecture ou d'écriture vers la mémoire). |
| 47 | |
| 48 | [[Image(soclib_tp4_gdb.png)]] |
60 | | Pour utiliser GDB Server, il est généralement préférable de lancer le simulateur dans un mode où la plate-forme est "gelée", |
61 | | et attend la connexion du GDB Server. Cela peut être réalisé en définissant la variable d'environnement SOCLIB_GDB avant de lancer le simulateur : |
62 | | {{{ |
63 | | $ export SOCLIB_GDB=START_FROZEN |
| 62 | Pour utiliser GDB Server, il est généralement préférable de lancer le simulateur dans un mode où le processeur est "gelé". |
| 63 | Dans ce mode, le GDB serveur ne transmet aucune requêtedu processeur vers le cache, et attend la connexion du client GDB. Cela peut être réalisé en définissant la variable d'environnement SOCLIB_GDB avant de lancer le simulateur : |
| 64 | {{{ |
| 65 | $ export SOCLIB_GDB=F |
| 164 | L'archive [attachment:soclib_tp5.tgz soclib_tp3.tgz] contient différents fichiers dont vous aurez besoin pour ce TP. |
| 165 | Créez un répertoire de travail spécifique TP5, recopiez l'archive dans ce répertoire TP5, et décompressez-la: |
| 166 | {{{ |
| 167 | $ tar xzvf soclib_tp3.tgz |
| 168 | }}} |
| 169 | |
| 170 | == 2.9 Travail à réaliser == |
| 171 | |
| 172 | On va dans utiliser l'architecture mono-processeur du TP4, |
| 173 | sur laquelle on exécutera l'application logicielle "Hello Word!". Mais deux ''bugs'' ont été volontairement introduit dans le logiciel, et l'objet de cette première partie est de localiser et de corriger ces deux ''bugs'', en utilisant l'outil '''GDB Server'''. |
| 174 | |
| 175 | Commencer par vous placer dans le répertoire '''soft''', et lancez le Makefile pour générer le fichier '''bin.soft''', ainsi que le |
| 176 | fichier '''bin.soft.txt''' qui contient la version désassemblée (lisible) du logiciel embarqué. |
| 177 | |
| 178 | Lancez l'exécution du simulateur dans une première fenêtre... et constatez que vous n'obtenez pas le résultat attendu. |
| 179 | |
| 180 | Modifiez le fichier '''tp4_top.cpp''' et le fichier '''tp5.desc''' pour introduire le GDB Server dans l'architecture comme indiqué ci-dessus. |
| 181 | Regénérez le simulateur en utilisant soclib-cc. Définissez la variable d'environnement SOCLIB_GDB. |
| 182 | Lancez l'exécution du simulateur dans une première fenêtre de travail. |
| 183 | |
| 184 | Ouvrez dans une seconde fenêtre le fichier '''bin.soft.txt''', de façon à pouvoir suivre - instruction par instruction - |
| 185 | le programme en cours d'exécution, depuis la première instruction du code de boot (adresse Oxbfc00000). |
| 186 | |
| 187 | Lancez le client GDB dans une troisième fenêtre, connectez-le au simulateur et désactivez le mécanisme de blocage sur Exceptions Interruptions et Trappes, en utilisant les deux commandes décrites plus haut. Commencez à exécuter le programme instruction par instruction avec la commande ''stepi''. Le premier dysfonctionnement apparaît assez rapidement... |
| 188 | |
| 189 | Quand les deux bugs ont été localisés et corrigés, vous pouvez attaquer l'étape suivante. |
| 190 | |
180 | | Cette organisation hiérarchique à deux niveaux impose évidemment que les valeurs des champs GADR des segments associés aux cibles d'un même cluster soient égales entre elles (ou appartiennent à un même ensemble de valeurs caractéristiques de ce cluster) |
181 | | |
182 | | = 4 Travail à réaliser = |
183 | | |
184 | | L'archive [attachment:soclib_tp5.tgz soclib_tp3.tgz] contient différents fichiers dont vous aurez besoin pour ce TP. |
185 | | Créez un répertoire de travail spécifique TP5, recopiez l'archive dans ce répertoire TP5, et décompressez-la: |
186 | | {{{ |
187 | | $ tar xzvf soclib_tp3.tgz |
188 | | }}} |
189 | | |
190 | | == 4.1 GDB Server == |
191 | | |
192 | | On va dans un premier temps utiliser une architecture mono-processeur plus simple que celle modélisée dans le TP4, |
193 | | sur laquelle on exécutera l'application logicielle "Hello Word!". Mais deux ''bugs'' ont été volontairement introduit dans le logiciel, et l'objet de cette première partie est de localiser et de corriger ces deux ''bugs'', en utilisant l'outil '''GDB Server'''. |
194 | | |
195 | | [[Image(soclib_tp4_cluster.png)]] |
196 | | |
197 | | Commencer par vous placer dans le répertoire '''soft''', et lancez le Makefile pour générer le fichier '''bin.soft''', ainsi que le |
198 | | fichier '''bin.soft.txt''' qui contient la version désassemblée (lisible) du logiciel embarqué. |
199 | | |
200 | | Lancez l'exécution du simulateur dans une première fenêtre... et constatez que vous n'obtenez pas le résultat attendu. |
201 | | |
202 | | Modifiez le fichier '''tp4_top.cpp''' et le fichier '''tp5.desc''' pour introduire le GDB Server dans l'architecture comme indiqué ci-dessus. |
203 | | Regénérez le simulateur en utilisant soclib-cc. Définissez la variable d'environnement SOCLIB_GDB. |
204 | | Lancez l'exécution du simulateur dans une première fenêtre de travail. |
205 | | |
206 | | Ouvrez dans une seconde fenêtre le fichier '''bin.soft.txt''', de façon à pouvoir suivre - instruction par instruction - |
207 | | le programme en cours d'exécution, depuis la première instruction du code de boot (adresse Oxbfc00000). |
208 | | |
209 | | Lancez le client GDB dans une troisième fenêtre, connectez-le au simulateur et désactivez le mécanisme de blocage sur Exceptions Interruptions et Trappes, en utilisant les deux commandes décrites plus haut. Commencez à exécuter le programme instruction par instruction avec la commande ''stepi''. Le premier dysfonctionnement apparaît assez rapidement... |
210 | | |
211 | | Quand les deux bugs ont été localisés et corrigés, vous pouvez attaquer l'étape suivante. |
212 | | |
213 | | == 4.2 architecture à 4 clusters == |
| 215 | Cette organisation hiérarchique à deux niveaux impose évidemment que les valeurs des champs GADR des adresses de base des segments associés aux cibles d'un même cluster soient égales entre elles (ou appartiennent à un même ensemble de valeurs caractéristiques de ce cluster) |
| 216 | |
| 217 | == 3.2 architecture à 4 clusters == |
216 | | Chaque cluster contiendra un processeur MIPS32, un composant ICU, et une mémoire. On se dispensera d'instancier le coprocesseur GCD dans cette architecture. On instanciera un seul contrôleur de TTY (contrôlant 4 terminaux numérotés de 0 à 3), un seul composant TIMER |
217 | | contenant 4 timers indépendants numérotés de 1 à 3), et une seule ROM de boot. |
218 | | On placera la ROM dans le cluster 0, le TIMER dans le cluster 1, et le TTY dans le cluster 3. |
| 220 | Chaque cluster contiendra un processeur MIPS32, un composant ICU, un contrôleur TTY, un TIMER et une mémoire RAM. On se dispensera d'instancier le coprocesseur GCD dans cette architecture. On placera la ROM de boot dans le cluster 0. On placera le contrôleur d'écran graphique FBF et le contrôleur DMA dans le cluster 1. On placera enfin le contrôleur de disque IOC dans le cluster 2. |
| 221 | |
221 | | Les composants TTY et TIMER générent chacun 4 lignes d'interruption: La ligne d'interruption IRQ_TIMER[i] doit être connectée à l'entrée IRQ[0] de l'ICU du cluster (i), et la ligne d'interruption IRQ_TTY[i] doit être connectée à l'entrée IRQ[1] de l'ICU du cluster (i). |
| 224 | Pour ce qui concerne les interruptions: |
| 225 | * Dans chaque cluster (i), la ligne d'interruption du TIMER sera connectée à l'entrée IRQ_IN[0] du composant ICU[i]. |
| 226 | * Dans chaque cluster (i), la ligne d'interruptiondu TTY sera connectée à l'entrée IRQ_IN[1] du composant ICU[i]. |
| 227 | * La ligne d'interruption du contrôleur IOC sera connectée à l'entrée IRQ_IN[2] du composant ICU[2]. |
| 228 | * La ligne d'interruption du contrôleur DMA sera connectée à l'entrée IRQ_IN[3] du composant ICU[1]. |