Changes between Version 110 and Version 111 of Archi-1-TP9


Ignore:
Timestamp:
Dec 11, 2020, 6:29:55 PM (4 years ago)
Author:
heydeman
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Archi-1-TP9

    v110 v111  
    777777{{{#!protected ------------------------------------------------------------------------------------
    778778'''''''''''''''
    779 - Par défaut les caractères tapés au clavier ne sont pas afficher 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.
     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.
    780780'''''''''''''''
    781781}}}
     
    802802'''''''''''''''
    803803}}}
    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.
    805805{{{#!protected ------------------------------------------------------------------------------------
    806806'''''''''''''''
     
    848848
    849849
    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.
     850Dans 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.
    851851
    852852**Objectifs**
     
    871871**Questions**
    872872
    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 ?
     8731. 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 ?
    874874{{{#!protected ------------------------------------------------------------------------------------
    875875'''''''''''''''
     
    880880{{{#!protected ------------------------------------------------------------------------------------
    881881'''''''''''''''
    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.
    883883* `.globl clock` permet de faire en sorte que la fonction soit visible par les autres fichiers C.
    884884'''''''''''''''
    885885}}}
    886 1. Ouvrez le fichier `kernel.x.s` et regarder 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 fonction. Le code de boot a besoin de `kinit()` et on l'obtiens avec la macro `la`.
     8861. 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.
    890890'''''''''''''''
    891891}}}
     
    893893**Exercices**
    894894
    895 - Comme d'habitude, exécutez le code et observez.
    896895- Afin de vous détendre un peu, vous allez créer un petit jeu `guess`
    897896  - `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.