Update putint and getint
And rapport for TD1
This commit is contained in:
parent
e2df8860bd
commit
26f9a4226f
4 changed files with 84 additions and 41 deletions
|
@ -5,6 +5,5 @@ int main(){
|
||||||
int number;
|
int number;
|
||||||
GetInt(&number);
|
GetInt(&number);
|
||||||
PutInt(number);
|
PutInt(number);
|
||||||
PutChar('\n');
|
|
||||||
} while(1 == 1);
|
} while(1 == 1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,15 @@
|
||||||
#include "syscall.h"
|
#include "syscall.h"
|
||||||
#define MAX_INPUT_SIZE 4
|
#define MAX_INPUT_SIZE 16
|
||||||
|
|
||||||
int main(){
|
int main(){
|
||||||
char t[100];
|
char t[100];
|
||||||
|
// this test write write on the output what the user entered in the input
|
||||||
|
// If we remove the loop, all caracters after MAX_INPUT_SIZE will be writed
|
||||||
|
// on my linux shell... A quite big security flaw, imagine
|
||||||
|
// 1234567812345678sudo rm -rf /\n ;)
|
||||||
do {
|
do {
|
||||||
|
//in our loop, char before the MAX_INPUT_SIZE sill be passed to the
|
||||||
|
// next getstring...
|
||||||
GetString(t, MAX_INPUT_SIZE);
|
GetString(t, MAX_INPUT_SIZE);
|
||||||
PutString(t);
|
PutString(t);
|
||||||
PutChar('\n');
|
PutChar('\n');
|
||||||
|
|
|
@ -68,17 +68,23 @@ int copyStringFromMachine(int from, char *to, unsigned size)
|
||||||
unsigned i = 0;
|
unsigned i = 0;
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
// Need to read size-1 to put final /0 if needed
|
// Need to read `size` value into memory to put final /0 if needed
|
||||||
while((i < size) && (machine->ReadMem(from+i,1,&res))){
|
for(i=0; i < size; i++){
|
||||||
|
|
||||||
|
// What should we do if a problem occurs when accessing
|
||||||
|
// memory?
|
||||||
|
if (machine->ReadMem(from+i,1,&res) == false){
|
||||||
|
DEBUG('s', "Error When reading memory in copyStringFromMachine\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
DEBUG('s', "\n ->copyFromMachine keycode:%d", res);
|
DEBUG('s', "\n ->copyFromMachine keycode:%d", res);
|
||||||
*(to+i) = (char)res;
|
*(to+i) = (char)res;
|
||||||
if ((char)res == '\0'){
|
if ((char)res == '\0'){
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
i++;
|
|
||||||
}
|
}
|
||||||
*(to+i)='\0';
|
*(to+size)='\0';
|
||||||
return size;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
int copyStringToMachine(int to, char* from, unsigned size)
|
int copyStringToMachine(int to, char* from, unsigned size)
|
||||||
|
@ -89,7 +95,10 @@ int copyStringToMachine(int to, char* from, unsigned size)
|
||||||
if (from[i] == '\0') {
|
if (from[i] == '\0') {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
machine->WriteMem(to+i,1,(int)from[i]);
|
if ( machine->WriteMem(to+i,1,(int)from[i]) == false) {
|
||||||
|
DEBUG('s', "Error when writing memory in copyStringFromMachine\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write the last /0
|
// Write the last /0
|
||||||
|
@ -148,7 +157,7 @@ ExceptionHandler (ExceptionType which)
|
||||||
case SC_GetChar:
|
case SC_GetChar:
|
||||||
{
|
{
|
||||||
DEBUG ('s', "GetChar.\n");
|
DEBUG ('s', "GetChar.\n");
|
||||||
// Get the char input an write it to the register n.2
|
// Get the char input and write it to the register n.2
|
||||||
int c = consoledriver->GetChar();
|
int c = consoledriver->GetChar();
|
||||||
machine->WriteRegister(2, c);
|
machine->WriteRegister(2, c);
|
||||||
break;
|
break;
|
||||||
|
@ -165,9 +174,11 @@ ExceptionHandler (ExceptionType which)
|
||||||
// Do not process char before size
|
// Do not process char before size
|
||||||
// but for now we don't have any method to determine if
|
// but for now we don't have any method to determine if
|
||||||
// string passed to our function est bigger than expected (size)
|
// string passed to our function est bigger than expected (size)
|
||||||
|
// It seems to be easier to check than in userspace mode
|
||||||
int n_char = ( size < MAX_STRING_SIZE) ? size : MAX_STRING_SIZE;
|
int n_char = ( size < MAX_STRING_SIZE) ? size : MAX_STRING_SIZE;
|
||||||
|
|
||||||
// allocate on byte more than buffer to put our \0 if needed
|
// allocate on byte more than buffer to put our \0 at the end,
|
||||||
|
// if needed
|
||||||
char *write = new char[n_char + 1];
|
char *write = new char[n_char + 1];
|
||||||
consoledriver->GetString(write, n_char);
|
consoledriver->GetString(write, n_char);
|
||||||
writesize = copyStringToMachine(addr, write, n_char);
|
writesize = copyStringToMachine(addr, write, n_char);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
---
|
---
|
||||||
title: systèmes d'exploitation, rapport TD1
|
title: systèmes d'exploitation, TD1
|
||||||
documentclass: scrartcl
|
documentclass: scrartcl
|
||||||
author:
|
author:
|
||||||
- Cédric Cassin
|
- Cédric Cassin
|
||||||
|
@ -15,16 +15,15 @@ linkstyle: bold
|
||||||
|
|
||||||
## Bilan
|
## Bilan
|
||||||
|
|
||||||
Ce premier TD est notre premier contact avec Nachos, et il faut bien avouer
|
Ce premier TD est notre première approche de Nachos, et il faut bien avouer
|
||||||
qu'il ne fut pas aussi mélodieux que dans *Rencontre du Troisième Type* de Steven
|
qu'il ne fut pas aussi mélodieux que le premier contact dans *Rencontre du
|
||||||
Spielberg.
|
Troisième Type* de Steven Spielberg.
|
||||||
|
|
||||||
Pour nous qui sommes sortis de la licence ADSILLH [^n_adsillh] nous
|
Nous qui sommes sortis de la licence ADSILLH [^n_adsillh] disposons un avantage
|
||||||
avions un avantage sur nos autres camarades: nous avons eu des **cours (et TDs) sur
|
sur certains de nos autres camarades: nous avons eu des **cours (et TDs) sur les
|
||||||
les appels systèmes GNU/Linux**. Nous avons aussi un handicap : nous sommes
|
appels systèmes GNU/Linux**. Nous avons aussi un handicap : nous sommes inscrits
|
||||||
inscrits en Master IDI, ce qui signifie que nous avons une vie professionnelle
|
en Master IDI, ce qui signifie que nous avons une vie professionnelle en plus de
|
||||||
en plus de notre vie étudiante, et pour l'un de nous une vie familiale. En gros
|
notre vie étudiante. En gros moins de temps personnels à consacrer à Nachos.
|
||||||
mois de temps personnels à consacrer à Nachos.
|
|
||||||
|
|
||||||
Nachos n'en reste pas mois un sujets intéressant -- bon effectivement nous n'en
|
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
|
ferons pas notre dernière vague tel Patrick Swayze dans *Point Break* -- mais
|
||||||
|
@ -36,34 +35,41 @@ developer ces premiers appels systèmes fut un travail enrichissant.
|
||||||
### Ce qui manque
|
### Ce qui manque
|
||||||
|
|
||||||
Comme vous pouvez l'imaginer après avoir lus les lignes précédentes, nous
|
Comme vous pouvez l'imaginer après avoir lus les lignes précédentes, nous
|
||||||
n'avons pas eu le temps d'implémenter `printf` au moment où nous écrivons ces
|
n'avons pas eu le temps d'implémenter un élément : `printf` manque à l'appel au
|
||||||
lignes[^n_finir].
|
moment où nous écrivons ces lignes[^n_finir].
|
||||||
|
|
||||||
[^n_finir]:la première version de ce rapport mentionnait aussi `PutInt` et
|
[^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.
|
`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
|
### Ce que nous avons
|
||||||
|
|
||||||
Nous avons cependant bien implémenté `PutChar`, `PutString`, `GetChar` et
|
Nous avons implémenté `PutChar`, `PutString`, `GetChar` et `Getstring`.
|
||||||
`Getstring`. Nous somme globalement satisfait du code que nous avons produit.
|
Nous sommes globalement satisfait du code que nous avons produit. Cependant des
|
||||||
Cependant des doutes subsistent sur l'implémentation de `Getstring`.
|
doutes subsistent sur l'implémentation de `Getstring`.
|
||||||
|
|
||||||
Nous avons aussi écrit les fonctions `CopyStringToMachine` et
|
Nous avons aussi écrit les fonctions `CopyStringToMachine` et
|
||||||
`CopyStringFromMachine` que nous avons positionné dans le fichier
|
`CopyStringFromMachine` que nous avons positionné dans le fichier
|
||||||
`userprog/exception.cc`. Ces deux fonctions pourraient en effet servir pour
|
`userprog/exception.cc`. Ces deux fonctions pourraient en effet servir pour
|
||||||
d'autres appels systèmes.
|
d'autres appels système.
|
||||||
|
|
||||||
### Les bugs
|
### Les bugs
|
||||||
|
|
||||||
A part un bug lors de la compilation de notre source de test pour l'appel
|
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.
|
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 a pas, mais les différents tests
|
Ce qui ne signifie pas pour autant qu'il n'y en ai pas, mais les différents
|
||||||
mis en place n'ont pas révélés de problèmes particuliers.
|
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
|
Le problème avec notre test de `PutString` (le source est dans
|
||||||
`test/pustring.c`) se produit à la compilation. Il semblerait aue si la chaine
|
`test/pustring.c`) se produisait à la compilation. d'après nos constatation, il
|
||||||
de caractère passées en paramètre est inférieure à la taille du tampon
|
semblerait que si la chaine de caractère passées en paramètre est inférieure à
|
||||||
(`MAX_STRING_SIZE`), alors l'erreur suivante apparaît à la compilation:
|
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
|
> putstring.c:(.text+0x10): dangerous relocation: Réadressage relatif GP utilisé alors que GP n'est pas défini
|
||||||
|
|
||||||
|
@ -86,9 +92,10 @@ dans *Les Goonies*.
|
||||||
[^n_modifs]:Pour les éléments où nous n'étions pas guidés par le sujet du TD.
|
[^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
|
Le point le plus délicat fut tout de même l'écriture de l'appel système
|
||||||
`GetString`. Elle a nécessite beaucoup d'aller retour **compilation / test /
|
`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
|
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ée ou même malmenée durant ce TD).
|
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
|
Afin de progresser sur cette partie, nous avons ajouté des `DEBUG` dans notre
|
||||||
code. Ainsi nous affichons **tout un tas d'informations utiles**.
|
code. Ainsi nous affichons **tout un tas d'informations utiles**.
|
||||||
|
@ -104,16 +111,36 @@ avons réussi à obliger `GetString` à respecter le paramètre `size` en compta
|
||||||
le nombre de caractères écrits, nos **n'avons pas réussi à détecter ce cas de
|
le nombre de caractères écrits, nos **n'avons pas réussi à détecter ce cas de
|
||||||
figure** pour éventuellement lancer une exception.
|
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
|
## Les tests
|
||||||
|
|
||||||
Pour `PutString`, nous avons écrit un petit programme permettant de tester
|
Pour `PutString`, nous avons écrit un petit programme permettant de tester
|
||||||
quelques sorties plus ou moins longue. Les éléments de debug nous ont permis de
|
|
||||||
corriger un problème de caractère qui passait à la trappe lors du passage au
|
corriger un problème de caractère qui passait à la trappe lors du passage au
|
||||||
tampon suivant.
|
tampon suivant.
|
||||||
|
|
||||||
Le test mets aussi en lumière une limitation de NachOS : **Il n'est pas très
|
Voici un exemple de sortie de cet appel avec la sortie de debug activée:
|
||||||
doué question caractères français**, mais elle n'est pas de notre fait.
|
|
||||||
Voici un exemple de sortie de notre appel avec la sortie de debug activée:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
[...]
|
[...]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue