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.