NachOS/rapports/td1/rapport.md
2021-10-19 08:19:21 +02:00

162 lines
6.5 KiB
Markdown

---
title: systèmes d'exploitation, TD1
documentclass: scrartcl
author:
- Cédric Cassin
- Yorick Barbanneau
fontsize: 13pt
mainfont: DejaVu Serif
geometry: [top=1.5cm, bottom=3cm, left=3cm, right=3cm]
header-includes:
- \definecolor{liens}{HTML}{de6a66}
urlcolor: liens
linkstyle: bold
...
## Bilan
Ce premier TD est notre première approche de Nachos, et il faut bien avouer
qu'il ne fut pas aussi mélodieux que le premier contact dans *Rencontre du
Troisième Type* de Steven Spielberg.
Nous qui sommes sortis de la licence ADSILLH [^n_adsillh] disposons un avantage
sur certains de nos autres camarades: nous avons eu des **cours (et TDs) sur les
appels systèmes GNU/Linux**. Nous avons aussi un handicap : nous sommes inscrits
en Master IDI, ce qui signifie que nous avons une vie professionnelle en plus de
notre vie étudiante. En gros moins de temps personnels à consacrer à Nachos.
Nachos n'en reste pas mois un sujets intéressant -- bon effectivement nous n'en
ferons pas notre dernière vague tel Patrick Swayze dans *Point Break* -- mais
developer ces premiers appels systèmes fut un travail enrichissant.
[^n_adsillh]:Administrateur et Développeur de Systèmes Informatique sous
Licences Libres et Hybrides
### Ce qui manque
Comme vous pouvez l'imaginer après avoir lus les lignes précédentes, nous
n'avons pas eu le temps d'implémenter un élément : `printf` manque à l'appel au
moment où nous écrivons ces lignes[^n_finir].
[^n_finir]:la première version de ce rapport mentionnait aussi `PutInt` et
`GetInt` mais nous avons réussi à les ajouter à la dernière minute.
Nous avons aussi implémenté la gestion des erreurs de mémoire dans les fonctions
`copyStringFromMachine` et `copyStringToMachine`, ces fonctions retourne **-1**
si une erreur se produit dans les instructions `ReadMem` et `WriteMem` (elles
retourne alors *false*), **mais** nous n'avons pas implémenté la gestion de ce
cas de figure dans les appels `PutString` et `Getstring`.
### Ce que nous avons
Nous avons implémenté `PutChar`, `PutString`, `GetChar` et `Getstring`.
Nous sommes globalement satisfait du code que nous avons produit. Cependant des
doutes subsistent sur l'implémentation de `Getstring`.
Nous avons aussi écrit les fonctions `CopyStringToMachine` et
`CopyStringFromMachine` que nous avons positionné dans le fichier
`userprog/exception.cc`. Ces deux fonctions pourraient en effet servir pour
d'autres appels système.
### Les bugs
A part un bug lors de la compilation de notre source de test pour l'appel
système `PutString`, nous n'avons pas repérés de bugs sur nos différents ajouts.
Ce qui ne signifie pas pour autant qu'il n'y en ai pas, mais les différents
tests mis en place n'ont pas révélés de problèmes particuliers.
Le problème avec notre test de `PutString` (le source est dans
`test/pustring.c`) se produisait à la compilation. d'après nos constatation, il
semblerait que si la chaine de caractère passées en paramètre est inférieure à
la taille du tampon (`MAX_STRING_SIZE`), alors l'erreur suivante apparaît à la
compilation:
> putstring.c:(.text+0x10): dangerous relocation: Réadressage relatif GP utilisé alors que GP n'est pas défini
La fonction semble pourtant fonctionner correctement puisque nous l'utilisons
dans le source servant à tester `GetString` et ce quel que soit la taille du
texte saisi.
Mais cette erreur abordée sur le chat de l'UE a été réglée grace au conseil de
Samuel Thibaud de rajouter une option dans le `Makefile` du dossier `test/`.
## Les points délicats.
Nous exagèrerions juste un peu en disant que tout le TD fut un point délicat...
Il nous a fallut du temps pour comprendre **comment les différents éléments
s'imbriquent** pour former un tout cohérent et les ceux à modifier pour ajouter
ce qui était demandé[^n_modifs]. Certaines modifications nous ont parfois
explosées (virtuellement) au visage, un peu comme certaines inventions de Data
dans *Les Goonies*.
[^n_modifs]:Pour les éléments où nous n'étions pas guidés par le sujet du TD.
Le point le plus délicat fut tout de même l'écriture de l'appel système
`GetString`. Il a nécessite beaucoup d'aller retour **compilation / test /
modification** un peu à la manière d'un jeu-vidéo de type Rogue-Like (aucune
manette de jeu, clavier ou souris a été blessé ou même malmené durant ce
TD...).
Afin de progresser sur cette partie, nous avons ajouté des `DEBUG` dans notre
code. Ainsi nous affichons **tout un tas d'informations utiles**.
Ces différents retours nous on permit de régler les problème que nous avions
dans les fonctions `CopyStringToMachine` et `ConsoleDriver::GetString`, mais
aussi améliorer globalement notre code.
## Limitations
Dans notre appel `GetString`, il est possible de passer une adresse mémoire vers
une chaine de caractère plus grande que la taille donnée en paramètre. Si nous
avons réussi à obliger `GetString` à respecter le paramètre `size` en comptant
le nombre de caractères écrits, nos **n'avons pas réussi à détecter ce cas de
figure** pour éventuellement lancer une exception.
Un problème de sécurite peux alors se produite et il est simple à tester avec
`test/getstring_2`, le voici illustré :
```
/test@machine $ ./nachos -x ../test/getstring_2
12345678912345678ls
1234567891234567
[...]
test@machine $ ls
addrspace.cc bitmap.cc consoledriver.cc console.o
[...]
```
On voit bien que les caractères dépassant le tampon de 16 caractères on **été
transmit à la console du système hôte** de NachOS. dans notre test, un simple
`ls` a été effectué, mais un `rm -rf ~` serait un peu plus problematique.
Nos différents tests sur le chaînes de caractères mettent aussi en lumière une
limitation de NachOS : **Il n'est pas très doué question caractères accentués**,
et a l'air de ne pas parler l'UTF-8 mais cette limitation n'est pas de notre
fait.
## Les tests
Pour `PutString`, nous avons écrit un petit programme permettant de tester
corriger un problème de caractère qui passait à la trappe lors du passage au
tampon suivant.
Voici un exemple de sortie de cet appel avec la sortie de debug activée:
```
[...]
->copyFromMachine keycode:72
->copyFromMachine keycode:101
->copyFromMachine keycode:108
->copyFromMachine keycode:108
->copyFromMachine keycode:111
->copyFromMachine keycode:32
->copyFromMachine keycode:87
->copyFromMachine keycode:111
Read buffer:Hello Wo, size:8
Hello Wo
[...]
```
Pour `GetString`, nous avons aussi écrit un programme de test, celui-ci fait
une boucle infinie attendant une saisie utilisateur et la retranscrit grâce à un
`PutString`.