Changes between Version 68 and Version 69 of SoclibCourseTp4
- Timestamp:
- Dec 8, 2010, 6:03:19 PM (14 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
SoclibCourseTp4
v68 v69 65 65 == 2.2 Communication entre l'OS et le contrôleur TTY == 66 66 67 Dans le TP3, le programme utilisateur utilise l'appel système '' tty_getc()'' pour lire un caracère.67 Dans le TP3, le programme utilisateur utilise l'appel système '''tty_getc()''' pour lire un caracère. 68 68 Cet appel système bloquant contient une boucle de scrutation dans laquelle, à chaque tour de boucle, 69 69 on effectue une transaction sur le bus pour lire la valeur du registre STATUS du terminal TTY concerné. 70 70 On ne sort de cette boucle que lorsqu'un caractère a effectivement été saisi au clavier. 71 71 72 Dans ce TP4, le programme utilisateur utilisera l'appel système '' tty_get_irq()'' pour lire un caractère.72 Dans ce TP4, le programme utilisateur utilisera l'appel système '''tty_get_irq()''' pour lire un caractère. 73 73 Cet appel système utilise un tampon mémoire partagé '''_tty_get_buf''', protégé par une variable de synchronisation '''-tty_get_full'''. 74 74 Ces deux variables appartiennent au système d'exploitation et sont stockées dans le segment ''seg_kunc'', 75 75 qui est à la fois protégé (non accessible par les programmes utilisateur) et non cachable. 76 76 77 Plutôt que d'effectuer une scrutation sur le registre STATUS du contrôleur TTY, l'appel système ''tty_get_irq()'' 78 teste la variable '''_tty_get_full''', ce qui permet (en principe) au système d'exploitation d'attribuer le processeur 79 à un autre programme utilisateur si te tampon est vide. C'est la routine d'interruption (ISR) associée au 80 terminal TTY qui se charge d'écrire le code ASCII du caractère dans le tampon '''_tty_get_buf''', et de 81 forcer à 1 la variable de synchronsation '''_tty_get_full''' pour signaler que le tampon est plein. Cette variable de synchronisation est remise à 0 82 par l'appel système ''tty_getc_irq()'' lorsque le caractère est transféré du tampon système '''tty_get_buf''' 83 vers le tampon mémoire défini par l'utilisateur. 84 85 Dans une architecture monoprocesseur, le processeur peut exécuter plusieurs tâches (plusieurs programmes utilisateurs) en pseudo-paralléliseme, par multiplexage temporel. Chaque tâche possède alors son propre terminal écran/clavier, qui sont tous contrôlés par le même contrôleur TTY. Dans une architecture multi-processeurs, chaque processeur peut exécuter plusieurs tâches, et on a un contrôleur TTY séparé pour chaque processeur . 77 Plutôt que d'effectuer une scrutation sur le registre STATUS du contrôleur TTY, l'appel système '''tty_get_irq()''' 78 teste la variable '''_tty_get_full''' rangée en mémoire. Si la valeur de cette variable indique qu'il n'y a pas de caractère 79 disponible, le système d'exploitation peut (en principe) attribuer le processeur à un autre programme utilisateur. C'est la routine d'interruption (ISR) associée au terminal TTY qui se charge d'écrire le code ASCII du caractère dans le tampon '''_tty_get_buf''', et de forcer à 1 la variable de synchronsation '''_tty_get_full''' pour signaler que le tampon est plein. Cette variable de synchronisation est remise à 0 par l'appel système ''tty_getc_irq()'' lorsque le caractère est transféré du tampon système '''tty_get_buf''' vers le tampon mémoire défini par l'utilisateur. 80 81 Dans une architecture monoprocesseur, le processeur peut exécuter plusieurs tâches (plusieurs programmes utilisateurs) en pseudo-paralléliseme, par multiplexage temporel. Chaque tâche possède alors son propre terminal écran/clavier, mais ces 82 différents terminaux sont tous contrôlés par le même contrôleur TTY : Chaque terminal a son propre jeu de 4 registres, 83 pour communiquer avec l'OS. 86 84 87 85 Le GIET supporte au plus 8 processeurs, et au plus 4 tâches par processeur. Le GIET supporte donc au plus … … 89 87 par le numéro du terminal concerné. 90 88 91 '''Question''' : Comment les deux entités communicantes (l'ISR et l'appel système) calculent-elles l'index du terminal concerné ? La réponse se trouve dans les fichier '' drivers.c'' et ''isr.s''.92 93 '''Question''' : Que fait la routine d'interruption ISR déclenchée par le périphérique TTY lorsqu'un caractère est frappé alors que la variable '''_tty_get_full[i]''' vaut 1 ? La réponse se trouve dans le fichier '' isr.s''.89 '''Question''' : Comment les deux entités communicantes (l'ISR et l'appel système) calculent-elles l'index du terminal concerné ? La réponse se trouve dans les fichier '''drivers.c''' et '''isr.s'''. 90 91 '''Question''' : Que fait la routine d'interruption ISR déclenchée par le périphérique TTY lorsqu'un caractère est frappé alors que la variable '''_tty_get_full[i]''' vaut 1 ? La réponse se trouve dans le fichier '''isr.s'''. 94 92 95 93 '''Question''' : Quel est l'avantage de ce type de communication par interruption, comparé au mécanisme de scrutation utilisé dans le TP3 ? … … 100 98 Tous les transferts se font par blocs de 512 octets. 101 99 102 '''Question''' : Editez le fichier '' stdio.c'' pour déterminer la signification des trois arguments de ces appels système. Editez le fichier ''drivers.c'' pour voir ce que font réellement les deux fonctions système '''_ioc_read()''' et '''_ioc_write()''' associées.100 '''Question''' : Editez le fichier '''stdio.c''' pour déterminer la signification des trois arguments de ces appels système. Editez le fichier '''drivers.c''' pour voir ce que font réellement les deux fonctions système '''_ioc_read()''' et '''_ioc_write()''' associées. 103 101 Quand ces fonctions rendent-elle la main au programme utilisateur? 104 102 105 L'appel système '''ioc_completed()''', qui appelle lui-même la fonction système '''_ioc_completed''' permet au programme utilisateur de de mettre en attente sur la fin d'un transfert. C'est donc une fonction bloquante qui ne rend la main au programme utilisateur que lorsque la variable de synch'onisation '''_ioc_busy''' a repris la valeur 0.106 107 '''Question''' : Quelle fonction met la variable '''_ioc_busy''' à 1 ? Quelle fonction remet cette variable à 0 ? QUelles sont les deux fonctions decette variable de synchronisation ? Dans quel segment doit-elle être rangée?103 L'appel système '''ioc_completed()''', qui appelle lui-même la fonction système '''_ioc_completed''' permet au programme utilisateur de se mettre en attente sur la fin d'un transfert. C'est donc une fonction bloquante qui ne rend la main au programme utilisateur que lorsque la variable de synch'onisation '''_ioc_busy''' a repris la valeur 0. 104 105 '''Question''' : Quelle fonction met la variable '''_ioc_busy''' à 1 ? Quelle fonction remet cette variable à 0 ? QUelles sont les deux services rendus par cette variable de synchronisation ? Dans quel segment doit-elle être rangée? 108 106 109 107 = 3 Modélisation de l'architecture matérielle = … … 115 113 }}} 116 114 117 Outre les fichiers qui permettent de générer le simulateur de l'architecture matérielle, cette archive contient également le sous-répertoire ''soft'' qui est utilisé pour la génération du logiciel embarqué.115 Outre les fichiers qui permettent de générer le simulateur de l'architecture matérielle, cette archive contient également un fichier '''images.raw''' qui contient une séquence d'images, et le sous-répertoire ''soft'' qui est utilisé pour la génération du logiciel embarqué. 118 116 119 117 '''Question''' : Complêtez le fichier '''tp4_top.cpp''' pour définir les adresses de base et les tailles des cinq segments associés aux composants ICU, TIMER, IOC, FBF et DMA, et pour introduire ces 5 segments dans la table des segments. Ces segments sont-ils cachables ou non cachables? … … 134 132 == 4.1 Code de boot == 135 133 136 En plus des registres $28, $29, SR et EPCle ''code de boot'' doit initialiser le vecteur d'interruption (c'est à dire le tableau indexé par le numéro d'interruption, et contenant les adresses des différentes routines d'interruption). Il doit également initialiser le composant ICU, pour démasquer les interruptions qu'on veut autoriser.137 138 '''Question''' : En ouvrant le fichier '''isr.s''', déterminez les nom des quatre ISRs associées aux composants T imer, TTY,134 Puisqu'on utilise des interruptions, le ''code de boot'' doit initialiser le vecteur d'interruption (c'est à dire le tableau indexé par le numéro d'interruption, et contenant les adresses des différentes routines d'interruption). Il doit également initialiser le composant ICU, pour démasquer les interruptions qu'on veut autoriser. 135 136 '''Question''' : En ouvrant le fichier '''isr.s''', déterminez les nom des quatre ISRs associées aux composants TIMER, TTY, 139 137 IOC et DMA. Modifiez le fichier '''reset.s''' pour initialiser les entrées correspondantes du vecteur d'interruption. 140 138 … … 143 141 démasquer les quatre lignes d'interruption utilisées : irq_in[0], irq_in[1], irq_in[2], irq_in[3]. 144 142 145 == 4.2 Activation du TIMER == o146 147 On va commencer par exécuter un programme main ()très simple, qui se contente d'activer la génération d'interruptions périodiques par le TIMER. Consultez le fichier ''stdio.c'' pour déterminer quels sont les deux appels système qui permettent de définir la période et d'autoriser le TIMER à générer les interruptions périodiques.143 == 4.2 Activation du TIMER == 144 145 On va commencer par exécuter un programme main_0 très simple, qui se contente d'activer la génération d'interruptions périodiques par le TIMER. Consultez le fichier ''stdio.c'' pour déterminer quels sont les deux appels système qui permettent de définir la période et d'autoriser le TIMER à générer les interruptions périodiques. 148 146 149 147 '''Question''' : modifiez le fichier '''main_0.c''' pour que le TIMER génère des interruptions avec une période de 100000 cycles.