Changes between Version 164 and Version 165 of Archi-1-TP9


Ignore:
Timestamp:
Nov 21, 2021, 4:37:29 PM (3 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Archi-1-TP9

    v164 v165  
    8508501. Dans le fichier `kinit.c`, il est question d'un loopback, à quoi cela sert-il ?
    851851{{{#!protected ------------------------------------------------------------------------------------
    852 '''''''''''''''
     852''
    853853- Par défaut les caractères tapés au clavier ne sont pas affichés par le matériel. Or, l'utilisateur s'attend au fait que s'il tape sur une touche, celle-ci s'affiche. Comme ce n'est pas le matériel qui le fait c'est au logiciel de le faire.
    854 '''''''''''''''
     854- Le fait que ce soit le logiciel qui fait cette opération de loopback permet de savoir que le programme tourne. Si un caractère s'affiche quand on tape au clavier, c'est qu'un morceau du programme a lu le registre `read` et réécrit cette valeur dans le registre `write`.
     855''
    855856}}}
    8568571. Dans le fichier `kinit.c`, on trouve `__tty_regs_map[ tty%NTTYS ].write = *s`, expliquez le modulo.
    857858{{{#!protected ------------------------------------------------------------------------------------
    858 '''''''''''''''
     859''
    859860* C'est une sécurité, un peu inutile ici, qui permet de ne pas écrire en dehors de la zone des registres du contrôleur de tty
    860 '''''''''''''''
     861''
    861862}}}
    8628631. Exécutez le programme sur le simulateur. Qu'observez-vous ? Est-ce que les deux fenêtres ont le même comportement vis-à-vis du clavier ?
    863864{{{#!protected ------------------------------------------------------------------------------------
    864 '''''''''''''''
     865''
    865866- Deux fenêtres sont apparues avec un message uniquement dans la fenêtre `proc0_term0`.
    866867- Non. Quand on tape dans la fenêtre `proc0_term0`, les touches tapées s'affichent alors que rien ne se passe dans la fenêtre `proc0_term1`.
    867 '''''''''''''''
     868''
    868869}}}
    869870
     
    872873- Modifiez le code pour afficher un message sur le second terminal, il y a toujours une attente sur le premier terminal.
    873874{{{#!protected ------------------------------------------------------------------------------------
    874 '''''''''''''''
     875''
    875876- C'est juste deux copier-coller (message et boucle d'affichage).
    876 '''''''''''''''
    877 }}}
    878 - Modifiez le code pour que le programme affiche les touches tapées au clavier sur les deux terminaux. C'est-à-dire, ce que vous tapez sur le terminal `proc0_term0` s'affiche sur ce même terminal, et pareil pour `proc0_term1`. L'idée est de ne plus faire d'attente bloquante sur le registre `TTY_STATUS` de chaque terminal. Pour que cela soit plus amusant, changez la casse sur le terminal `proc1_term1` (si vous tapez `bonjour 123`, il affiche `BONJOUR 123` et inversement.
    879 {{{#!protected ------------------------------------------------------------------------------------
    880 '''''''''''''''
     877''
     878}}}
     879- Modifiez le code pour que le programme affiche les touches tapées au clavier sur les deux terminaux. C'est-à-dire, ce que vous tapez sur le terminal `proc0_term0` s'affiche sur ce même terminal, et pareil pour `proc0_term1`. L'idée est de ne plus faire d'attente bloquante sur le registre `TTY_STATUS` de chaque terminal. Pour que cela soit plus amusant, changez la casse (minuscule ←→ majuscule) sur le terminal `proc1_term1` (si vous tapez `bonjour 123`, il affiche `BONJOUR 123` et inversement.
     880{{{#!protected ------------------------------------------------------------------------------------
     881''
    881882{{{#!c
    882883void kinit (void)
     
    912913    while (1);
    913914}}}
    914 '''''''''''''''
    915 }}}
    916 
     915''
     916}}}
    917917
    918918
     
    922922
    923923
    924 Dans l'étape précédente, nous accédons au registre de périphérique directement dans la fonction `kinit()`, ce n'est pas très simple. C'est pourquoi nous allons ajouter un niveau d'abstraction qui représente un début de pilote de périphérique (device driver). Ce pilote, même tout petit constitue une couche logicielle avec une API.
     924Dans l'étape précédente, nous accédons aux registres de périphérique directement dans la fonction `kinit()`, ce n'est pas très simple. C'est pourquoi nous allons ajouter un niveau d'abstraction qui représente un début de pilote de périphérique (device driver). Ce pilote, même tout petit constitue une couche logicielle avec une API.
    925925
    926926**Objectifs**
     
    945945**Questions**
    946946
    947 1. Le code du driver du TTY est dans le fichier `harch.c` et les prototypes sont dans `harch.h`. Si vous ouvrez `harch.h` vous allez voir que seuls les prototypes des fonctions `tty_read()` et `tty_write()` sont présents. La structure décrivant la carte des registres du `TTY` est déclarée dans le .c. Pourquoi avoir fait ainsi ?
    948 {{{#!protected ------------------------------------------------------------------------------------
    949 '''''''''''''''
     9471. Le code du driver du TTY est dans le fichier `harch.c` et les prototypes sont dans `harch.h`. Si vous ouvrez `harch.h` vous allez voir que seuls les prototypes des fonctions `tty_read()` et `tty_write()` sont présents. La structure décrivant la carte des registres du `TTY` est déclarée dans le `.c`. Pourquoi avoir fait ainsi ?
     948{{{#!protected ------------------------------------------------------------------------------------
     949''
    950950- Le noyau n'a pas besoin de savoir comment sont organisés les registres dans le TTY. Il a juste besoin de savoir comment écrire ou lire un message. Plus c'est cloisonné, moins il y a de risque de problèmes. En outre, cela simplifie un hypothétique portage sur une autre architecture.
    951 '''''''''''''''
     951''
    952952}}}
    9539531. Le MIPS dispose d'un compteur de cycles internes. Ce compteur est dans un banc de registres accessibles uniquement quand le processeur fonctionne en mode `kernel`. Nous verrons ça au prochain cours, mais en attendant nous allons quand même exploiter ce compteur. Pourquoi avoir mis la fonction dans `hcpua.S` ? Rappeler, pourquoi avoir mis `.globl clock`