Changes between Version 110 and Version 111 of Archi-1-TP9
- Timestamp:
- Dec 11, 2020, 6:29:55 PM (4 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
Archi-1-TP9
v110 v111 777 777 {{{#!protected ------------------------------------------------------------------------------------ 778 778 ''''''''''''''' 779 - Par défaut les caractères tapés au clavier ne sont pas affich erpar 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.779 - 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. 780 780 ''''''''''''''' 781 781 }}} … … 802 802 ''''''''''''''' 803 803 }}} 804 - Modifiez le code pour que le programme affiche les touches tapé s 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.804 - 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. 805 805 {{{#!protected ------------------------------------------------------------------------------------ 806 806 ''''''''''''''' … … 848 848 849 849 850 Dans l'étape 4, 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.850 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. 851 851 852 852 **Objectifs** … … 871 871 **Questions** 872 872 873 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é dans le .c. Pourquoi avoir fait ainsi ?873 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 ? 874 874 {{{#!protected ------------------------------------------------------------------------------------ 875 875 ''''''''''''''' … … 880 880 {{{#!protected ------------------------------------------------------------------------------------ 881 881 ''''''''''''''' 882 * La fonction qui lit ce registre est nécessairement en assembleur, elle est donc mise dans hcpu.S.882 * La fonction qui lit ce registre (`$9` qui ne désigne pas un registre GPR du processeur !) est nécessairement en assembleur car elle utilise des instructions particulières et dépend du matériel, elle est donc mise dans hcpu.S. 883 883 * `.globl clock` permet de faire en sorte que la fonction soit visible par les autres fichiers C. 884 884 ''''''''''''''' 885 885 }}} 886 1. Ouvrez le fichier `kernel.x.s` et regarderoù a été placée la fonction `clock()`.\\Est-ce un problème si `kinit()` n'est plus au début du segment `ktext` ? Posez-vous la question de qui a besoin de connaître l'adresse de `kinit()`887 {{{#!protected ------------------------------------------------------------------------------------ 888 ''''''''''''''' 889 * Non, ce n'est pas un problème puisque ça fonction . Le code de boot a besoin de `kinit()` et on l'obtiens avec la macro `la`.886 1. Compilez et exécutez le code avec `make exec`. Observez. Ensuite ouvrez le fichier `kernel.x.s` et regardez où a été placée la fonction `clock()`.\\Est-ce un problème si `kinit()` n'est plus au début du segment `ktext` ? Posez-vous la question de qui a besoin de connaître l'adresse de `kinit()` 887 {{{#!protected ------------------------------------------------------------------------------------ 888 ''''''''''''''' 889 * Non, ce n'est pas un problème puisque ça fonctionne. Le code de boot a besoin de l'adresse de `kinit()` mais on l'obtient avec la macro `la` - c'est l'éditeur de lien qui fera en sorte que dans les code binaire l'adresse de `kinit()` mise dans le registre `$26` soit la bonne. 890 890 ''''''''''''''' 891 891 }}} … … 893 893 **Exercices** 894 894 895 - Comme d'habitude, exécutez le code et observez.896 895 - Afin de vous détendre un peu, vous allez créer un petit jeu `guess` 897 896 - `guess` tire un nombre entre '0' et '9' et vous devez le deviner en faisant des propositions.\\`guess` vous dit si c'est trop grand ou trop petit.