Simple Operating System

Introduzione

Quando utilizziamo un computer, prima ancora di utilizzare le applicazioni a cui siamo abituati stiamo utilizzando un Sistema Operativo (OS). I più famosi e popolari sistemi operativi sono Windows, MacOS e Linux. Storicamente UNIX è stato il primo sistema operativo scritto nel linguaggio C, e ha rappresentato uno step importante nella storia dei sistemi operativi.

Non tutti i sistemi operativi moderni discendono da UNIX.
Non tutti i sistemi operativi moderni discendono da UNIX.

Un sistema operativo è un programma. Un programma significativo, con dei ruoli molto particolari. Un sistema operativo deve, prima di tutto, interagire con l'hardware disponibile in modo da sfruttare e gestire nel modo migliore tutte le risorse offerte dalla macchina su cui esegue. Si parla quindi della CPU, della memoria, della GPU, del disco, del monitor, dei dispositivi rimovibili, e via dicendo.

Il sistema operativo sta in mezzo all'hardware della macchina: CPU, memoria, GPU, disco, monitor, tastiera e mouse, rete e dispositivi USB.
Il sistema operativo sta in mezzo all'hardware della macchina: CPU, memoria, GPU, disco, monitor, tastiera e mouse, rete e dispositivi USB.

Come seconda cosa il sistema operativo deve implementare tutte le astrazioni software che sono necessarie per permettere alle nostre applicazioni di girare in modo efficiente e sicuro. Tra queste astrazioni troviamo: la gestione della CPU tramite uno scheduler, la gestione della memoria tramite un allocatore, la gestione delle trap, la gestione dei permessi, la divisione tra user space e kernel space, e via dicendo.

Una delle più importanti astrazioni implementate da un sistema operativo è il layer delle chiamate di sistema, che implementa la divisione tra kernel space e user space. Il kernel space è la parte del sistema operativo privilegiata, che interagisce con l'hardware e che decide come implementare i meccanismi di sicurezza. Nello user space invece troviamo le classiche applicazioni, come il browser, il text editor, la shell, il terminale, e qualsiasi altra applicazione utilizziamo ogni giorno. Queste applicazioni girano in ambienti meno privilegiati e possono funzionare proprio perché dietro c'è un kernel che parla con l'hardware. Per comunicare con il kernel le applicazioni user space utilizzano le chiamate di sistema.

Le applicazioni vivono in user space; il kernel vive in kernel space; questi due spazi interagiscono tramite le system call.
Le applicazioni vivono in user space; il kernel vive in kernel space; questi due spazi interagiscono tramite le system call.

Quando implementiamo un sistema operativo dobbiamo scegliere quale hardware supportare. Questa scelta non è banale da fare. Sistemi operativi moderni, come Linux, supportano tantissimi hardware diversi. Più hardware supportiamo, e più cresce la complessità del sistema operativo. In questo progetto didattico scriveremo un sistema operativo che supporta un hardware specifico: l'architettura RISC-V a 32 bit. Perché RISC-V? Perché a differenza di altre architetture, come x86-64 e x86, l'architettura RISC-V è più semplice e utile per un progetto didattico.

Linux supporta decine di architetture, da x86 a RISC-V; in questo progetto scegliamo RISC-V a 32 bit.
Linux supporta decine di architetture, da x86 a RISC-V; in questo progetto scegliamo RISC-V a 32 bit.

Durante lo sviluppo non abbiamo bisogno di un hardware reale con un processore RISC-V. Tutto l'hardware infatti sarà emulato all'interno di una macchina virtuale tramite virt e QEMU. Questo significa che il progetto potrà essere seguito da qualsiasi computer.

Il kernel compilato viene dato a QEMU, che emula la macchina virt con CPU RISC-V, memoria, seriale e disco.
Il kernel compilato viene dato a QEMU, che emula la macchina virt con CPU RISC-V, memoria, seriale e disco.

Riferimenti

Il progetto segue la traccia del libro di Seiya Nuta. Le specifiche RISC-V che lo seguono sono le altri fonti primarie.

  1. Operating System in 1,000 Lines, Seiya Nuta.

  2. The RISC-V Instruction Set Manual.

  3. RISC-V Supervisor Binary Interface Specification.

  4. Virtual I/O Device (VIRTIO) Specification, OASIS.

  5. OpenSBI.

  6. «virt» Generic Virtual Platform, QEMU.

Struttura del progetto

8 Milestone
~
24 Step