Capitolo 1
Introduzione
In questa tesi si descrive lo sviluppo di un Sistema Operativo. Lo scopo principale di un SO è quello di fornire un ambiente nel quale sia possibile sviluppare programmi in modo efficiente e conveniente da parte di una comunità di programmatori. Questo implica che il SO debba offrire ai programmatori delle risorse adatte allo sviluppo ed all'esecuzione dei programmi in prima istanza e quindi deve anche fornire i meccanismi per garantire la condivisione di tali risorse. Le risorse messe a disposizione sono l'hardware, il software ed i dati. Il SO raccoglie le funzioni di controllo ed allocazione di tali risorse.
Questa tesi si inserisce in un progetto - che è stato chiamato Theos (Threaded Educational Operating System) - che si persegue al DEEI da alcuni anni con lo scopo di realizzare un prototipo di SO che sia sufficientemente semplice da costituire una `palestra' didattica per realizzare e provare con semplicità sia dei componenti classici dei SO, quali ad esempio il file system o la gestione della memoria e dell'I/O, e sia per sperimentare idee innovative quali ad esempio tecniche di prefetching. Come tale, il presente lavoro è una continuazione ed un miglioramento di una versione precedente.
L'architettura del sistema è ispirata in parte al SO Unix. Il nucleo, cioè, contiene le primitive di gestione della memoria, dei processi, della schedulazione e dell'I/O mentre gli utenti dialogano con il sistema mediante un insieme di chiamate di sistema attraverso una opportuna interfaccia basata sulle `trap' (si veda il capitolo 6. I processi vengono creati e terminati mediante delle chiamate di sistema; il codice eseguibile di alcuni comandi del SO sono contenuti in file che vengono caricati in memoria ed eseguiti. L'architettura di Theos è descritta in fig.1.1.

Figuraa 1.1: L'architettura del sistema Theos
Nel seguito, viene data una descrizione introduttiva e sommaria del principio di funzionamento del sistema. I processi sono rappresentati mediante delle struttura dati che contengono le varie informazioni necessarie alla gestione degli stessi, quali i registri di lavoro, vari puntatori alle risorse utilizzate (codice, stack, dati, heap, file aperti etc.). Tali strutture sono accodate in un array di liste concatenate a diversa priorità. Lo schedulatore esamina le liste per scegliere il prossimo processo da eseguire. La schedulazione in Theos è quindi di tipo prioritario.
I processi attivi nel sistema sono quindi quelli presenti in questa struttura (processi 'pronti in memoria').
Il processo che ha attualmente il possesso della unità centrale è individuato da un puntatore particolare, che punta sempre alla struttura del processo attualmente in esecuzione.
I processi possono a loro volta creare od eliminare altri processi accodando queste strutture nelle liste o togliendole dalle medesime.
I caratteri digitati sulla tastiera sono catturati ad interrupt e messi in una struttura (array) interna al nucleo.
Quando viene riconosciuto il carattere , viene inserita nella lista una struttura che individua l'attivazione immediata della procedura di Shell, che ha il compito di interpretare il comando dato da tastiera. Alcuni comandi vengono eseguiti da moduli software che sono inclusi nel nucleo stesso (comandi built-in) mentre altri sono contenuti in file. In entrambi i casi viene accodata la relativa struttura nella lista per la conseguente schedulazione. Le differenze tra questi due modi di esecuzione sono che: i processi eseguiti da file girano in modalità utente e viene allocata una zona di memoria per il codice mentre i processi eseguiti da procedure di sistema girano in modalità sistema e viene allocata solo una zona di memoria per i dati.
La principale caratteristica originale ed innovativa del sistema rispetto alla versione precedente è la gestione dei processi con l'utilizzo dei threads, con lo sviluppo di una libreria per la loro gestione, e l'introduzione degli strumenti software (editor, compilatore, assemblatore) per lo sviluppo dei programmi che interagiscono con il nucleo tramite delle chiamate di sistema.
La struttura di questa tesi è la seguente. Il sistema è descritto attraverso l'individuazione di alcuni aspetti fondamentali intorno ai quali si è sviluppato l'intero sistema:
- processi concorrenti (trattati nel Capitolo 2; in questo capitolo si descrivono anche: la schedulazione, le strutture dei thread ed i meccanismi di sincronizzazione)
- gestione della memoria in Theos (trattata nel Capitolo 3; vengono descritti l'allocazione e l'utilizzo delle regioni di codice, dati stack ed heap. La memoria è gestita in modo contiguo con approccio first-fit)
- gestione ed architettura dei file (Capitolo 4; si descrivono: il file system, il sistema delle protezioni ed il sistema delle password)
- interfaccia utente, sia in termini di comandi (Capitolo 5) che in termini di chiamate di sistema (Capitolo 6)
- strumenti software per lo sviluppo dei programmi: editor, compilatore, assemblatore (descritti nel Capitolo 7)
Per mantenere la descrizione di questi aspetti la più semplice possibile, in questi Capitoli gli algoritmi relativi sono stati descritti esaustivamente utilizzando sostanzialmente degli pseudocodici scritti in linguaggio naturale e mantenento i nomi delle procedure inalterati; la descrizione in codice C è lasciata a qualche aspetto particolare, per esempio alla descrizione di alcune strutture dati ed a qualche semplice algoritmo.
Per consentire uno sviluppo agevole del software, si è utilizzata una piattaforma hardware particolare, costituita da due schede basate sul processore 68030, di cui una usata per lo sviluppo del codice e l'altra usata per la sua esecuzione. Il controllo del codice in esecuzione è effettuato mediante un programma di debug che, assieme ad alcuni programmi di utilità, costituisce il corredo software necessario per lo sviluppo del sistema. Tutti questi aspetti sono descritti nelle Appendici.