Il Kernel di PandOS
in questa fase ci siamo occupati dell’implementazione della fase 3 del sistema operativo, il kernel minimale.
il kernel:
- svolge l’avvio del sistema operativo, inizializzando le strutture dati necessarie e caricando il primo processo nella coda dei processi a bassa priorità
- si occupa di gestire Eccezioni (Interrupt, TLB, Traps e Syscalls)
- si occupa di organizzare i processi
Scelte implementative
il nostro kernel si suddivide in un file main che si occupa dell’inizializzazione del sistema e di diverse librerie, tra cui:
- exceptionHandler
- si occupa semplicemente di leggere il codice dell’eccezione e richiamare l’Handler appropriato per gestirla
- inoltre dopo la gestione, effettua un controllo per vedere se è necessario richiamare lo scheduler in caso di necessità (come una syscall bloccante)
- interruptHandler
- si occupa di richiamare la funzione di gestione appropriata alla causa dell’interrupt
- contiene le funzione di gestione dei vari interrupt
- misc
- contiene le variabili globali (richiamate come esterne negli altri file) e alcune funzioni ausiliarie
- tra le variabili globali ausiliarie che abbiamo definito abbiamo
isScheduleNeeded
, che si occupa di tenere traccia della richiesta o meno dello scheduler
exception_time
e time_slice
, due variabili dedicate alla gestione del tempo di utilizzo salvato nei processi
chain
, un array di processi usato per cercare un processo, bloccato o meno
- i processi ausiliari presenti qui sono invece più esplicativi
copyState
copia lo stato del procesore memorizzato da una struttura dati ad un’altra
insertPcb
e removePcb
si occupano invece della gestione della chain
sopra mensionata
- scheduler
- un semplice scheduler con politica FIFO a duplice coda, una con priorità bassa e una con priorità alta
- si occupa anche di gestire un caso specifico della syscall yield
- syscall
- contiene le funzioni per la gestione delle syscall
- l’handler per reindirizzare il processo alla corretta syscall
- la funzione
passUpOrDie
Difficoltà implementative
nel nostro caso le difficoltà sono state sia interne che esterne, ci sono state diverse difficoltà nell’interpretare la documentazione e sviluppare tutto correttamente
nel dettaglio due funzioni delle syscall sono risultate particolarmente difficili da comprendere, la doIO
e la getCPUTime
invece, la parte dell’interrupt handler problematica è stata quella dedicata alla gestione dei terminali dato il suo stretto collegamento con la doIO
, che ha reso particolarmente difficile trovare l’errore nel codice.