36 | | Le composant ''!VciXcacheWrapper'' est un contrôleur de cache générique à interface VCI, qui peut être utilisé pour interfacer |
37 | | différents coeurs de processeur avec le reste du système. Le coeur du processeur est modélisé par un ISS (Instruction Set Simulateur). |
38 | | Le type du proceseur instancié (MIP32, ARM, SPARCV8, PPC405, NIOS, !MicroBlaze, etc.) est défini par un paramètre template |
39 | | du composant ''!VciXcacheWrapper''. |
| 36 | Le composant ''!VciXcacheWrapper'' peut être utilisé pour encapsuler différents processeur 32 bits. Le coeur du processeur est modélisé par un ISS (Instruction Set Simulateur). |
| 37 | Le type du proceseur instancié (MIP32, ARM, SPARCV8, PPC405, NIOS, !MicroBlaze, etc.) est défini par un paramètre template du composant ''!VciXcacheWrapper''. |
| 38 | Consultez la documentation [https://www.soclib.fr/trac/dev/wiki/Component/VciXcacheWrapper ici]. |
44 | | de l'espace addressable). Cela signifie que ce composant analysee les bits de poids fort de l'adresse VCI |
45 | | pour déterminer le segment désigné. Les dimensions des tableaux qui implémentent les bancs mémoire |
46 | | physique sont définis par les longueurs des segments définis dans la !MappingTable. |
47 | | |
48 | | Enfin le composant ''!VciMultiTty'' est un contrôleur de terminaux alpha-numériques. Ce contrôleur peut modéliser de 1 à 256 |
49 | | terminaux (un terminal est une paire écran / clavier). Pratiquement, chaque terminal est modélisé par l'ouverture |
50 | | d'une fenêtre XTERM indépendante sur l'écran de la station de travail qui exécute la simulation. |
51 | | Chaque terminal possède 4 registres adressables pour la lecture ou l'écriture, et on ne peut lire ou écrire qu'un seul caractère par transaction. |
52 | | |
| 43 | de l'espace addressable). Le composant analyse les bits de poids fort de l'adresse VCI |
| 44 | pour déterminer le segment désigné. Les bancs de mémoire physique correspondant aux différents segments |
| 45 | sont modélisés par des tableaux C++ dont la longueur est définie par les valeurs stockées dans la !MappingTable. |
| 46 | Consultez la documentation [https://www.soclib.fr/trac/dev/wiki/Component/VciSimpleRam ici]. |
| 47 | |
| 48 | Enfin le composant ''!VciMultiTty'' est un contrôleur de terminaux alpha-numériques. Ce composant peut contrôler de 1 à 256 terminaux (un terminal est une paire écran / clavier). Pratiquement, chaque terminal est modélisé par l'ouverture d'une fenêtre XTERM indépendante sur l'écran de la station de travail qui exécute la simulation. |
| 49 | Chaque terminal possède 4 registres adressables pour la lecture ou l'écriture, et fonctionne en mode ''caractère'': |
| 50 | on ne peut lire ou écrire qu'un seul caractère par transaction. |
| 51 | Consultez la documentation [https://www.soclib.fr/trac/dev/wiki/Component/VciMultiTty ici]. |
| 52 | |
71 | | Chaque processeur est modélisé par un ISS (Instruction Set Simulator), qui doit - pour chaque instruction - |
72 | | lire l'instruction dans le cache, la décoder et l'exécuter. C'est évidemment le contrôleur du cache qui se charge d'aller |
73 | | lire le code binaire chargé dans les mémoires embarquées en cas de MISS. |
74 | | |
75 | | Ce code binaire doit donc être généré par un cross-compilateur spécifique. Dans le cas du processeur MIPS32, on utilise la chaîne de compilation GCC, |
76 | | pour compiler l'ensemble du logiciel embarqué (code applicatif en C, et code système en assembleur MIPS32), et générer du code MIPS32. |
77 | | |
78 | | Le résultat de cette compilation est un fichier au format ELF, contenant le code binaire exécutable par le processeur MIP32. |
| 70 | Le processeur doit, à chaque instruction lire l'instruction dans le cache, la décoder et l'exécuter. C'est évidemment le contrôleur du cache qui se charge d'aller lire le code binaire chargé dans les mémoires embarquées en cas de MISS. |
| 71 | |
| 72 | Le code binaire doit donc être généré par un cross-compilateur spécifique pour le processeur MIPS32. On utilise la chaîne de compilation GCC, pour compiler l'ensemble du logiciel embarqué (code applicatif et code système) et pour réaliser l'édition de liens entre le code applicatif écrit par vous, et le code système. Le résultat de cette compilation est un fichier au format ELF, contenant le code binaire exécutable par le processeur MIP32. |
115 | | L'archive fournie contient en particulier les fichiers suivants correspondant aux modèles des composants instanciés : |
116 | | * `vci_xcache_wrapper.h` : définition du composant `VciXcacheWrapper` |
117 | | * `vci_xcache_wrapper.cpp` : méthodes associées |
118 | | * `vci_lcd_coprocessor.h` : définition du composant `VciLcdCoprocessor` |
119 | | * `vci_lcd_coprocessor.cpp` : méthodes associées |
120 | | * `vci_simple_ram.h` : définition du composant `VciSimpleRam` |
121 | | * `vci_simple_ram.cpp` : méthodes associées |
122 | | * `vci_multi_tty.h` : définition du composant `VciMultiTty` |
123 | | * `vci_multi_tty.cpp` : méthodes associées |
124 | | * `vci_vgsb.h` : définition du composant `VciVgsb` |
125 | | * `vci_vgsb.cpp` : méthodes associées |
126 | | * `tp3_top.cpp` : top-cell de l'architecture |
127 | | |
134 | | * '''seg_tty''' est le segment associé au contrôleur de terminaux TTY. On prendra pour adresse de base la valeur 0xC0000000, et pour longueur 64 octets, ce qui permet d'adresser jusqu'à 4 terminaux indépendants (consulter la spécification fonctionnelle du composant VciMultiTty). |
135 | | * '''seg_lcd''' est le segment associé au coprocesseur LCD. On prendra pour adresse de base la valeur 0x90000000. La longueur de 16 octets correspond aux quatre registres adressables de ce composant. |
| 115 | * '''seg_tty''' est le segment associé au contrôleur de terminaux TTY. On prendra pour adresse de base la valeur 0xC0000000, et pour longueur 64 octets, ce qui permet d'adresser jusqu'à 4 terminaux indépendants. |
| 116 | * '''seg_gcd''' est le segment associé au coprocesseur GCD. On prendra pour adresse de base la valeur 0x90000000. La longueur de 16 octets correspond aux quatre registres adressables de ce composant. |
142 | | Remarquez que les 2 segments correspondant aux périphériques (seg_tty et seg_lcd), ainsi que les deux segments correspondant au code système sont dans la zone |
143 | | protégée de l'espace adressable, qui n'est accessible qu'en mode ''kernel''. |
144 | | |
145 | | '''Remarque importante''' : Ces informations de segmentation sont utilisées à la fois par le matériel et par le logiciel embarqué. Elles doivent donc être définies à deux endroits : |
146 | | 1. Dans le fichier ''tp3_top.cpp'' pour définir le contenu de la !MappingTable, qui est utilisée configurer les composants matériels. |
147 | | 1. Dans le fichier ''soft/ldscript'' qui est utilisé par l'éditeur de liens lors de la compilation du logiciel embarqué, pou définir les adresses de base des différents segments (mémoire et périphériques). |
148 | | |
149 | | Complêtez les fichiers ''tp3_top.cpp'' et ''soft/ldsript'' pour définir les adresses de base et les longueurs des segments. |
| 123 | Remarquez que les 2 segments correspondant aux périphériques (seg_tty et seg_lcd), ainsi que les deux segments correspondant au code système sont dans la zone protégée de l'espace adressable, qui n'est accessible qu'en mode ''kernel'' (adresses supérieures à 0x80000000). |
| 124 | |
| 125 | '''Remarque importante''' : Certaines informations sont utilisées à la fois par le matériel et par le logiciel embarqué, et doivent donc être définies à deux endroits : |
| 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, qui est est utilisée 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'' (pour le matériel), 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 | ainsi que le nombre de terminaux utilisés. |
155 | | * 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 d'exécuter l'instruction ''eret''. |
156 | | * le fichier '''giet.s''' est écrit en assembleur et contient le code du Gestionnaire d'Interruption, Exceptions et Trappes. Ce code s'exécute en mode ''kernel'', et se termine toujours par une instruction ''eret''. |
157 | | * le fichier '''syscall.s''' est écrit en assembleur et contient le code des quelques appels système disponibles sur cette plate-forme minimale. Ils s'exécutent en mode ''kernel'', et permettent l'accès aux périphériques. |
158 | | * le fichier '''stdlib.c''' est la version C des appels système définis dans le fichier ''syscalls.s''. Ces fonction C se contentent d'encapsuler l'instruction assembleur ''syscall'' après avoir placé les valeurs des arguments dans les registres appropriés. Elles peuvent donc être appelées depuis un programme s'exécutant en mode ''user''. |
159 | | * le fichier '''main.c''' est écrit en C et contient n'importequelle application logicielle qui se contente des quelques appels système définis dans ''stdlib.c''. |
160 | | * le fichier '''Makefile''' permet de lancer la compilation du logiciel embarqué. |
161 | | |
162 | | '''Question''' : Quels sont les appels système qui permettent d'accéder à un terminal TTY ? Quels sont les arguments des fonctions C correspondantes? |
| 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''. |
| 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 |
| 141 | les fonctions définies dans le fichier ''stdio.c''. |
| 142 | * le fichier '''ldscript''' contient les directives pour l'éditeur de liens. |
| 143 | * le fichier '''Makefile''' permet de lancer la génération du logiciel embarqué. |
| 144 | |
| 145 | '''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 ? |
| 146 | |
165 | | 1. Elle modifie le registre 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. |
166 | | 1. Elle effectue un branchement à l'adresse contenue dans le registre EPC (registre 14 du coprocesseur ''système''). |
167 | | |
168 | | '''Question''' : Quels sont les registres initialisés par le code de boot ? pouquoi ces initialisations ? |
169 | | |
170 | | Puisqu'on dispose d'un contrôleur de terminal dans l'architecture, le premier programme que vous allez exécuter se contentera d'afficher le célèbre ''hello world'' sur le terminal. Ouvrez lz fichier ''soft/main.c''. |
171 | | |
172 | | '''Question''' : Que fait ce programme ? (on rappelle que la fonction ''getc()'' est bloquante, et ne rend pas la main au programme appelant tant qu'un caractère |
173 | | n'a pas été saisi au clavier). |
| 149 | 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. |
| 150 | 1. Elle effectue un branchement à l'adresse contenue dans le registre protégé EPC (registre 14 du coprocesseur ''système''). |
| 151 | |
| 152 | '''Question''' : Quels sont les initialisations réalisées par le code de boot ? pouquoi ces initialisations ? |
| 153 | |
| 154 | Le premier programme que vous allez exécuter se contente d'afficher le célèbre ''hello world'' sur le terminal. |
| 155 | Ouvrez le fichier ''soft/main.c''. |
| 156 | |
| 157 | '''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). |
180 | | Il faut compléter le fichier ''tp3_top.cpp'', pour définir les segments enregistrés dans la MappingTable, |
181 | | définir les arguments des constructeurs ainsi que les valeurs des paramètres template des différents composants matériels instanciés, |
182 | | et définir le cheminom permettant au ''loader'' des composants ROM et RAM d'accéder au fichier ELF. |
| 164 | Complétez le fichier ''tp3_top.cpp'': Il faut enregister les 7 segments dans la MappingTable. |
| 165 | Il faut définir les arguments de tous les constructeurs des composants instanciés, ainsi que les valeurs de |
| 166 | leurs paramètres template. Il faut définir le cheminom permettant au ''loader'' des composants ROM et RAM |
| 167 | d'accéder au fichier ''soft/bin.soft'' contenant le code binaire. |