Changes between Version 164 and Version 165 of Archi-1-TP9
- Timestamp:
- Nov 21, 2021, 4:37:29 PM (3 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
Archi-1-TP9
v164 v165 850 850 1. Dans le fichier `kinit.c`, il est question d'un loopback, à quoi cela sert-il ? 851 851 {{{#!protected ------------------------------------------------------------------------------------ 852 '' '''''''''''''852 '' 853 853 - 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 '' 855 856 }}} 856 857 1. Dans le fichier `kinit.c`, on trouve `__tty_regs_map[ tty%NTTYS ].write = *s`, expliquez le modulo. 857 858 {{{#!protected ------------------------------------------------------------------------------------ 858 '' '''''''''''''859 '' 859 860 * 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 '' 861 862 }}} 862 863 1. 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 ? 863 864 {{{#!protected ------------------------------------------------------------------------------------ 864 '' '''''''''''''865 '' 865 866 - Deux fenêtres sont apparues avec un message uniquement dans la fenêtre `proc0_term0`. 866 867 - 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 '' 868 869 }}} 869 870 … … 872 873 - Modifiez le code pour afficher un message sur le second terminal, il y a toujours une attente sur le premier terminal. 873 874 {{{#!protected ------------------------------------------------------------------------------------ 874 '' '''''''''''''875 '' 875 876 - 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 '' 881 882 {{{#!c 882 883 void kinit (void) … … 912 913 while (1); 913 914 }}} 914 ''''''''''''''' 915 }}} 916 915 '' 916 }}} 917 917 918 918 … … 922 922 923 923 924 Dans l'étape précédente, nous accédons au registrede 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.924 Dans 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. 925 925 926 926 **Objectifs** … … 945 945 **Questions** 946 946 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 '' '''''''''''''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 '' 950 950 - 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 '' 952 952 }}} 953 953 1. 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`