Changes between Version 68 and Version 69 of SoclibCourseTp4


Ignore:
Timestamp:
Dec 8, 2010, 6:03:19 PM (14 years ago)
Author:
alain
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • SoclibCourseTp4

    v68 v69  
    6565== 2.2 Communication entre l'OS et le contrôleur TTY ==
    6666
    67 Dans le TP3, le programme utilisateur utilise l'appel système ''tty_getc()'' pour lire un caracère.
     67Dans le TP3, le programme utilisateur utilise l'appel système '''tty_getc()''' pour lire un caracère.
    6868Cet appel système bloquant contient une boucle de scrutation dans laquelle, à chaque tour de boucle,
    6969on effectue une transaction sur le bus pour lire la valeur du registre STATUS du terminal TTY concerné.
    7070On ne sort de cette boucle que lorsqu'un caractère a effectivement été saisi au clavier.
    7171
    72 Dans ce TP4, le programme utilisateur utilisera l'appel système ''tty_get_irq()'' pour lire un caractère.
     72Dans ce TP4, le programme utilisateur utilisera l'appel système '''tty_get_irq()''' pour lire un caractère.
    7373Cet appel système utilise un tampon mémoire partagé '''_tty_get_buf''', protégé par une variable de synchronisation '''-tty_get_full'''.
    7474Ces deux variables appartiennent au système d'exploitation et sont stockées dans le segment ''seg_kunc'',
    7575qui est à la fois protégé (non accessible par les programmes utilisateur) et non cachable.
    7676 
    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 .
     77Plutôt que d'effectuer une scrutation sur le registre STATUS du contrôleur TTY, l'appel système '''tty_get_irq()'''
     78teste 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
     79disponible, 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
     81Dans 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
     82différents terminaux sont tous contrôlés par le même contrôleur TTY : Chaque terminal a son propre jeu de 4 registres,
     83pour communiquer avec l'OS.
    8684 
    8785Le GIET supporte au plus 8 processeurs, et au plus 4 tâches par processeur. Le GIET supporte donc au plus
     
    8987par le numéro du terminal concerné.
    9088
    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'''.
    9492
    9593'''Question''' : Quel est l'avantage de ce type de communication par interruption, comparé au mécanisme de scrutation utilisé dans le TP3 ?
     
    10098Tous les transferts se font par blocs de 512 octets.
    10199
    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.
    103101Quand ces fonctions rendent-elle la main au programme utilisateur?
    104102
    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 de cette variable de synchronisation ? Dans quel segment doit-elle être rangée?
     103L'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?
    108106 
    109107= 3 Modélisation de l'architecture matérielle =
     
    115113}}}
    116114
    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é.
     115Outre 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é.
    118116
    119117'''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?
     
    134132== 4.1 Code de boot ==
    135133
    136 En plus des registres $28, $29, SR et EPC 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.
    137 
    138 '''Question''' : En ouvrant le fichier '''isr.s''', déterminez les nom des quatre ISRs associées aux composants Timer, TTY,
     134Puisqu'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,
    139137IOC et DMA. Modifiez le fichier '''reset.s''' pour initialiser les entrées correspondantes du vecteur d'interruption.
    140138
     
    143141démasquer les quatre lignes d'interruption utilisées : irq_in[0], irq_in[1], irq_in[2], irq_in[3].
    144142
    145 == 4.2 Activation du TIMER ==o
    146 
    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
     145On 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.
    148146
    149147'''Question''' : modifiez le fichier '''main_0.c''' pour que le TIMER génère des interruptions avec une période de 100000 cycles.