Changes between Version 61 and Version 62 of SoclibCourseTp4
- Timestamp:
- Dec 5, 2010, 2:39:30 PM (15 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
SoclibCourseTp4
v61 v62 15 15 D'un autre côté, on souhaite modéliser des architectures comportant plusieurs processeurs programmables. 16 16 17 Il existe deux types de périphériques: 17 = 2. Interruptions vectorisées = 18 19 Nous allons introduire deux types de périphériques utilisant des interruptions pour communiquer avec le système d'exploitation: 18 20 19 21 * Un contrôleur TTY est un périphérique ''caractère'' car il supporte des requêtes de lecture ou d'écriture d'un seul caractère. Ce type de périphérique se comporte comme une cible sur le bus, puisqu'il ne peut que recevoir des commandes provenant d'un processeur, et qu'il n'a pas la possibilité de lire ou d'écrire lui-même en mémoire. 20 22 21 23 * Par opposition un périphérique ''bloc'', tel qu'un contrôleur de disque, doit tranférer de grosses quantités de données entre la mémoire et le disque. Les transferts se font par blocs (un bloc contenant généralement 512 octets), et ces périphériques ont généralement une capacité DMA : Ils sont à la fois maître et cible sur le bus, cat ils peuvent directement lire ou écrire en mémoire. 22 23 = 2. Interruptions vectorisées =24 24 25 25 == 2.1 composants matériels == … … 29 29 connecté au processeur. 30 30 31 Ceci nécessite d'introduire un nouveau composant matériel dans l'architecture : Le composant '''vci_icu''' est 32 un contrôleur d'interruptions vectorisées. C'est une cible VCI dont vous trouverez la spécification fonctionnelle [https://www.soclib.fr/trac/dev/wiki/Component/VciIcu ici]. 31 Le composant '''vci_icu''' est un contrôleur d'interruptions vectorisées. C'est une cible VCI dont vous trouverez la spécification fonctionnelle [https://www.soclib.fr/trac/dev/wiki/Component/VciIcu ici]. Prenez le temps de la lire. 33 32 34 33 Le composant '''vci_multi_timer''' est également une cible VCI … … 36 35 [https://www.soclib.fr/trac/dev/wiki/Component/VciMultiTimer ici]. 37 36 38 Le composant '''vci_block_device''' est un contrôleur de périphérique de stockage externe (disque ou mémoire flash). Ce composant IOC est à la fois un initiateur VCI, capable de lire et d'écrire dans la mémoire, et une cible qui peut recevoir des commandes de configuration. Le composant IOC ne gère qu'un unique fichier, stocké sur le disque de la station de travail qui exécute le simulateur. Le nom de ce fichier est un argument du constructeur. On trouvera la spécification fonctionnelle de ce composant [https://www.soclib.fr/trac/dev/wiki/Component/VciBlockDevice ici].37 Le composant '''vci_block_device''' est un contrôleur de périphérique de stockage externe (disque ou mémoire flash). Ce composant IOC est à la fois un initiateur VCI, capable de lire et d'écrire dans la mémoire, et une cible qui peut recevoir des commandes de configuration. Puisque nous sommes en simulation, le composant IOC gère un unique fichier, stocké sur le disque de la station de travail qui exécute le simulateur. Le nom de ce fichier est un argument du constructeur. On trouvera la spécification fonctionnelle de ce composant [https://www.soclib.fr/trac/dev/wiki/Component/VciBlockDevice ici]. 39 38 40 39 Le composant '''vci_frame_buffer''' est un contrôleur d'écran graphique. C'est une cible VCI qui est vue … … 52 51 53 52 Les lignes d'interruptions ne passent pas par le réseau VCI : chaque ligne d'interruption d'un périphérique 54 est directement connectée aux ports '''p_irq_in[i]''' du composant ICU :53 est directement connectée aux ports d'entrée '''p_irq_in[i]''' du composant ICU : 55 54 * La ligne d'interruption du TIMER est connectée au port '''p_irq_in[0]''' 56 55 * la ligne d'interruption du TTY est connectée au port '''p_irq_in[1]''' … … 180 179 = 5. Architecture multi-processeurs générique = 181 180 182 Modifiez l'architecture matérielle de la section 3 pour introduire un nombre variable de processeurs. 181 On veut maintenant modéliser une architecture matérielle multi-processeur générique. 182 183 == 5.1 architecture matérielle == 184 185 Modifiez le fichier '''tp3_top.cpp''' et renommez-le '''tp3_top_multi.cpp''' . 183 186 Chaque processeur aura son propre concentrateur d'interruption (un composant ICU par processeur), 184 187 et son propre contrôleur TTY (un contrôleur TTY par processeur). 185 Le nombre de processeurs doit être un paramètre défini sur la ligne de commande au lancement du simulateur. 186 187 On souhaite exécuter sur cette architecture matérielle une application logicielle multi-tâches coopérative. 188 189 == 5.1 architecture matérielle == 188 Le nombre de processeurs NPROCS doit être un paramètre défini sur la ligne de commande au lancement du simulateur. 189 Le GIET ne pouvant supporter que 8 processeurs, on vérifiera que le paramètre NPROCS est inférieur ou égal à 8. 190 191 Il faut définir des tableaux de pointeurs pour les composants PROC[i], ICU[i], et TTY[i], ainsi que pour les signaux associés, 192 et introduire des boucles indexées par l'index du processeur chaque fois que ces composants sont concernés. 193 194 * il faut définir NPROCS segments pour les NPROCS TTY[i] 195 * il faut définir NPROCS segments pour les NPROCS ICU[i] 196 * Les NPROCS composants 190 197 191 198 == 5.2 Code de boot == 199 200 Un vrai système d'exploitation tel que LINUX ou MutekH permet de créer dynamiquement de nouvelles tâches (i.e. de nouveaux programmes utilisateurs) alors que la machine est déjà démarrée (mécanisme ''pthread_create()'' pour les threads POSIX, ou mécanisme fork/exec pour les processus UNIX). 201 Le GIET n'étant pas un vrai système d'exploitation, ne supporte pas la création ou la destruction dynamique de tâches : Les tâches doivent être créées une fois pour toute au démarrage de la machine, c'est à dire dans le code de boot. 202 203 Bien que le GIET supporte le fonctionnement multi-tâches (un seul processeur exécute plusieurs tâches par multiplexage temporel), on va utiliser ici un mécanisme plus simple: Tous les processeurs exécutent le même ''code de boot, 204 mais l'exécution de ce code dépend de l'index du processeur. 205 L'index du processeur étant stockée dans un registre système (registre $15 pour le processeur MIPS32), sa valeur peut être testée par le logiciel. cette valeur est initialisée par le constructeur, ce qui modélise une valeur ''cablée'' lors de la fabrication de la puce. 206 207 == 5.3 Exécution paralléle de programmes non-coopératifs == 192 208 193 209 == 5.4 Programme coopératif multi-tâches ==