home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.disi.unige.it
/
2015-02-11.ftp.disi.unige.it.tar
/
ftp.disi.unige.it
/
pub
/
.person
/
GianuzziV
/
SysOp
/
esame97
/
note_eserc_1.txt
< prev
next >
Wrap
Text File
|
1997-12-02
|
4KB
|
98 lines
PRIMA ESERCITAZIONE LABORATORIO III (1997/98)
Suggerimenti per l'inserimento di una nuova funzione di MINIX.
Per inserire una nuova funzione occorre lavorare su due livelli:
1. Compilazione di un programma contenente la nuova funzione
(ad esempio "new()").
Il compilatore cerca i riferimenti a funzioni non definite
dall'utente (ad esempio printf) in librerie di sistema.
Per sapere quali sono queste librerie si puo' compilare un
programmino di prova con l'opzione "verbose".
2. Implementazione della funzione nel sistema MINIX.
Per il primo punto, sappiamo che MINIX espande, attraverso
funzioni di libreria, una chiamata di sistema (ad esempio
getpid()) nella sequenza:
* prepara il messaggio usando i parametri di chiamata ed
altre informazioni necessarie
* chiama la funzione interna di MINIX
sendrec(server, codice_funzione, puntatore_messaggio).
Nel caso getpid avremo sendrec(MM, GETPID, &m).
GETPID e' un numero intero che servira' al server MM per
individuare la funzione richiesta.
* riconverte i valori di ritorno del messaggio in parametri
di ritorno della funzione.
Per ogni funzione di minix per utenti ci sara' quindi una
funzione di conversione che implementa quanto detto sopra.
Per aggiungere una funzione occorrera' anche definire il
corrispondente codice_funzione, che deve essere un numero
non gia' utilizzato.
Per il secondo punto, occorrera' inserire in MM o FS, a seconda
del tipo di funzione, il codice che effettua quanto richiesto.
Per rendere operativa questa seconda fase, poiche' si effettua
una modifica al sistema operativo, occorre generare un nuovo
"image" e quindi un nuovo floppy di bootstrap.
Un buon modo di procedere e' prendere una funzione gia' esistente
e semplice, ad esempio getpid(), e vedere come e' trattata.
Dopo aver visto com'e implementata getpid, inserite una nuova
funzione che fa esattamente la stessa cosa.
I sorgenti delle librerie per il compilatore MINIX si trovano come
sottodirectory nella directory /usr/src/lib.
In tale directory si trova anche il Makefile che serve per generare
le librerie stesse (una libreria e' una collezione di funzioni
precopilate, unite fra loro dal programma di archiviazione "aal").
Il nome di una libreria e' "lib*.a".
Sono definiti tre target: all, install e clean.
Leggete attentamente sia all che install (sevono entrambi).
Consiglio: togliete il comando rm *.o se non volete ricompilare
tutte le funzioni ogni volta che fate una modifica e ricordatevi
di impostare la data quando bootstrappate.
I file di include si trovano in /usr/include.
I sorgenti del kernel e dei server di MINIX si trovano in
/usr/src/kernel, /usr/src/mm, /usr/src/fs.
Attenzione: MINIX mette a disposizione anche la shell "tcsh" piu'
evoluta di "sh" e piu' comoda. Il suo funzionamento non e' pero'
sempre corretto, ad esempio non richiama la shell "sh" per
interpretare gli script che iniziano con #!/bin/sh.
COME "COSTRUIRE" UN FLOPPY BOOSTRAP DI MINIX
Il sistema operativo minix e' un unico eseguibile (chiamato image) costruito
unendo insieme diversi eseguibili, fra i quali:
/usr/src/kernel/kernel
/usr/src/fs/fs
/usr/src/fs/mm
........
Il file /usr/src/tools/Makefile contiene uno script per make che "dirige"
la costruzione di image.
Il target "programs" richiama make con
/usr/src/kernel/Makefile
/usr/src/fs/Makefile
/usr/src/mm/Makefile
.......
che costruiscono rispettivamente gli eseguibili kernel, fs e mm.
Infine esegue il target "image", che unisce gli eseguibili nell'unico
file image.
Il file /usr/src/tools/mkboot contiene uno script per la shell sh che partendo
da image consente di costruire un floppy di bootstrap, dando come parametri
"fdboot /dev/fd0" (ovviamente occorre inserire un floppy formattato solo
hardware in A).
Ricordo che nel comando make con il flag -n ottenete la sequenza di comandi
che make attiverebbe, senza l'esecuzione degli stessi.