Organizzazione di un Sistema Operativo
Abbiamo analizzato i principi di progetto, definito gli obiettivi e a grandi linee, esaminato gli strumenti messi a disposizione. Ora siamo in grado di tracciare un'ipotetica organizzazione del nostro Sistema Operativo.
Per cominciare cerchiamo di suddividere l'intera struttura in un preciso numero di livelli o strati. In questo modo sarà possibile dividere meglio il lavoro; la teoria non ci fornisce un numero fisso di moduli, esso dipende da molti fattori (numero di sviluppatori, tempo a disposizione, dimensione complessiva del progetto). Occorre tenere presente che applicando una frammentazione eccessiva si corre il rischio di risultare troppo dispersivi. D'altro canto moduli di dimensioni elevate comportano complessità nello sviluppo e tempi di debug in grado di compromettere il progetto.
Ecco come si potrebbe presentare la struttura del nostro Sistema Operativo; identifichiamo un totale di sei livelli.
Livello 0 - Astrazione dell'hardware e virtualizzazione della CPU
In questo modulo prepariamo l'infrastruttura per la gestione delle interrupt, diamo vita alla nozione di processo e estendiamo l'architettura della CPU ottenendo uno o più processori virtuali. Parte della RAM viene riservata a tali procedure e risulta quindi opportuno (ma non strettamente necessario) oscurare questi settori in modo tale da evitare pericolosi accessi in scrittura da parte dei livelli superiori.
Livello 1 - Virtualizzazione della memoria
L'esaurimento della memoria è sempre stato uno dei peggiori incubi del programmatore. A tutt'oggi non esiste una soluzione ottimale a tale problema. Per ovviare a tutto ciò, in passato si è giunti all'adozione di un valido espediente: oltre alla memoria centrale si dedica allo stesso scopo un'area della memoria secondaria (residente nei dischi fissi). Tale area in Unix è nota come area di swap. Lo swapping (dall'inglese scambio, avvicendamento) consiste nel salvare parte dei dati necessari nell'area apposita in modo tale da poterli richiamare rapidamente in memoria centrale qualora siano necessari. In questo modo il programma ha l'illusione di avere sempre memoria sufficiente a disposizione. I programmatori sono perciò sollevati da una problematica non indifferente.Ultimamente, visti i costi attuali delle memorie RAM, tali meccanismi hanno perso molta della loro importanza. Lo scopo principale di questo livello è di astrarre completamente la gestione della memoria. I livelli superiori non avranno accesso a tale risorsa in modo diretto; semplicemente essi richiederanno a questo modulo la quantità di memoria necessaria, senza doversi preoccupare di come o dove tale memoria sia immagazzinata.
Livello 2 - Gestione dei dispositivi
In questo livello sviluppiamo i driver dei dispositivi che vogliamo supportare nel nostro progetto; ovviamente la dimensione di tale modulo varia dalla quantità di macchine su cui vorremo far correre il Sistema Operativo. Ciascun dispositivo viene semplificato il più possibile automatizzando al meglio il suo funzionamento e limitando quanto possibile il numero di istruzioni che è necessario impartire per poterlo dirigere.