Sistemi Operativi

Funzionamento di un sistema di calcolo

L’ avvio di un sistema operativo conseguente l’ accensione fisica di un calcolatore richiede la presenza di un apposito programma d’ avviamento chiamato boot e contenuto solitamente in una memoria a sola lettura (ROM) facente parte della struttura fisica del calcolatore. La sua funzione consiste nell’ inizializzare i diversi componenti del sistema, dalla CPU, ai controlli dei diversi dispositivi, fino al contenuto della memoria centrale (RAM). Il programma di avviamento deve poi caricare in memoria centrale il sistema operativo e avviarne l’ esecuzione, perciò individua e carica in memoria il nucleo del sistema operativo ed avvia in esecuzione il primo processo di elaborazione. Una volta avviato il sistema si attende qualche evento, che può essere causato da un dispositivo o da un programma. Nel primo caso si parla di interruzioni (interrupt), mentre nel secondo di eccezioni (trap). I sistemi operativi moderni sono caratterizzati dal fatto di essere guidati dalle interruzioni: se non ci sono processi in corso, dispositivi di I/O da servire o utenti con cui interagire, un sistema operativo resta inattivo, nell’ attesa che accada qualcosa. Per ciascun tipo di interruzione è presente una procedura di servizio che determina l’ azione da intraprendere. Quando riceve un segnale di interruzione la CPU interrompe l’ elaborazione corrente e trasferisce l’ esecuzione a una fissata locazione della memoria. Solitamente questa locazione contiene l’ indirizzo iniziale della procedura di servizio per quel dato segnale di interruzione. Considerando che il numero dei possibili segnali di interruzione è predefinito si può utilizzare una tabella di puntatori alle specifiche procedure di servizio. Ci sarà quindi una procedura generale che esamina le informazioni presenti nel segnale di interruzione e tramite il puntatore appropriato invoca la procedura di gestione dello specifico segnale di interruzione. La tabella di puntatori, detta vettore delle interruzioni è spesso mantenuta nella memoria bassa (le prime 1000 locazioni per esempio). L’ architettura di gestione delle interruzioni deve anche salvare l’ indirizzo dell’ istruzione interrotta per riprendere poi il processo che era in esecuzione dal punto esatto in cui era stato interrotto. Architetture recenti memorizzano l’ indirizzo di ritorno in strutture dati a pila (stack). Una volta terminato il servizio di interruzione si carica nel program counter l’ indirizzo di ritorno precedentemente salvato (quello in cima allo stack), consentendo la ripresa della computazione interrotta come se nulla fosse accaduto. La condivisione di risorse di sistema richiede che il sistema operativo assicuri che un programma scorretto non possa portare altri programmi (corretti) a funzionare non correttamente. Si deve quindi fornire un supporto per differenziare almeno tra due modi di funzionamento (dual mode):

La CPU ha un flag detto Mode bit che indica in quale modo si trova: supervisor (0) o user (1). Vengono definite delle istruzioni dette istruzioni privilegiate che possono causare danni al sistema e per tanto devono essere eseguite solamente in modo supervisore. Per esempio quando avviene un interrupt, l'hardware passa automaticamente in modo supervisore. Infatti tutte le istruzioni di I/O sono privilegiate. Se non fosse cosi una applicazione utente durante un’ operazione di I/O potrebbe compromettere la corretta esecuzione dell’ operazione stessa. Sorge quindi una domanda: dato che le istruzioni di I/O sono privilegiate, quindi dedicate al sistema, come può il programma utente eseguire dell'I/O? Attraverso le system call, che è il metodo con cui un processo applicativo richiede un'azione da parte del sistema operativo. Solitamente sono degli interrupt software chiamati trap. Il controllo passa attraverso il vettore di interrupt alla routine di servizio della trap nel sistema operativo, e il mode bit viene impostato a supervisor. Il sistema operativo verifica che i parametri siano legali e corretti, esegue la richiesta, e ritorna il controllo all'istruzione che segue la system call. Con l'istruzione di ritorno, il mode bit viene impostato a user. Si deve inoltre assicurare che un programma utente non possa mai passare in modo supervisore per esempio, andando a scrivere nel vettore delle interruzioni. Il vettore delle interruzioni e le routine di gestione degli interrupt vanno quindi salvaguardate. Per avere la protezione della memoria, si aggiungono due registri che determinano il range d indirizzi a cui un programma può accedere: registro base che contiene il primo indirizzosico legale registro limite che contiene la dimensione del range di memoria accessibile.

La memoria al di fuori di questo range è protetta. Oltre a proteggere le funzioni di I/O e la memoria, occorre assicurare che il sistema operativo mantenga il controllo dell’ elaborazione, impedendo quindi che un programma utente entri in un ciclo infinito o non richieda più servizi dal sistema. A tale scopo si può usare un timer che interrompe la computazione dopo periodi prefissati, per assicurare che periodicamente il sistema operativo riprenda il controllo. Il timer viene decrementato ad ogni tick del clock (1/50 di secondo,tipicamente). Quanto il timer, che serve anche per mantenere la data e l'ora, va a 0 avviene l'interrupt e il controllo torna al sistema operativo. Il timer viene usato comunemente per implementare il time sharing. Si noti che Il caricamento del timer è una istruzione privilegiata.























































Tutto quanto riportato in questa pagina è a puro scopo informativo personale. Se non ti trovi in accordo con quanto riportato nella pagina, vuoi fare delle precisazioni, vuoi fare delle aggiunte o hai delle proposte e dei consigli da dare, puoi farlo mandando un email. Ogni indicazione è fondamentale per la continua crescita del sito.