Compilare MentOS: Mentoring Operating System

Per il laboratorio di Sistemi Operativi, è stato richiesto di incominciare a adocchiare in modo autonomo MentOS1, Mentoring Operating System, un sistema operativo “hobbystico” sviluppato da alcuni studenti dell’Università di Verona. A differenza di molti altri sistemi operativi utilizzati in altri corsi, MentOS è tra i pochi a seguire in modo dogmatico le linee guida messe a disposizione da Linux, implementando le stesse strutture dati e algoritmi.

Questo articolo vuole essere una sorta di guida passo passo per la compilazione di MentOS. Le sezioni a seguire dipendono tutte dal sistema operativo host in cui andate a compilare MentOS.

Per Ubuntu/Debian

Prima di procedere con l’installazione dei pacchetti per MentOS, procediamo con l’aggiornare eventuali pacchetti già installati:

sudo apt update && sudo apt upgrade -y

Per compilare MentOS serviranno alcuni pacchetti come build-essential (pacchetto che include compilatori GNU per C e C++), git (per il sistema di versioning), cmake (sistema di build), qemu-system-i386 (per creare una macchina virtualizzata) e doxygen (per la generazione della documentazione). La flag -y assume già la scelta YES durante l’installazione.

Installiamo i pacchetti attraverso apt:

sudo apt-get install -y build-essential git cmake qemu-system-i386 doxygen
Nel caso di sistemi operativi diversi da Ubuntu/Debian, ma sempre Unix-based, potete sostituire apt con il vostro gestore di pacchetti preferito o già installato nella macchina host. Ad esempio su Arch, dovrebbe essere sufficiente il pacchetto base-devel.

Per chi fosse interessato anche a debuggare MentOS, gli sviluppatori hanno implementato un sistema molto veloce e semplice che si basa sull’utilizzo di cgdb e xterm.

sudo apt-get install -y cgdb xterm

MacOS

Per MacOS, l’installazione dei pacchetti è un compito un po’ più difficile rispetto all’installazione su Unix-based: MacOS infatti non ha un sistema di gestione dei pacchetti. Per sopperire a questa mancanza, alcuni sviluppatori hanno creato Brew, un gestore di pacchetti non ufficiale.

Come per la sezione Unix-based, procediamo nell’aggiornare la lista dei pacchetti tramite il comando:

sudo brew update && brew upgrade

Installiamo i pacchetti obbligatori per la compilazione di MentOS:

sudo brew install i386-elf-binutils i386-elf-gcc git cmake qemu nasm

Se vogliamo debuggare, installiamo anche cgdb e xterm:

sudo brew install cgdb xterm

“Non mi piace Brew/voglio provare il brivido di compilare gcc da solo”

Se non ti piace Brew e vuoi provare il brivido di compilare gcc da solo su una piattaforma MacOS, complimenti per il coraggio. Segui le istruzioni nell’articolo compilazione della toolchain su MacOS.

Compilazione

Per tutti i sistemi operativi (tranne Windows, non considerato in questa guida), i passi per compilare MentOS sono gli stessi.

Eseguiamo git clone per reperire il codice sorgente di MentOS (<clone_directory> è la cartella dove vogliamo avere i sorgenti):

git clone https://github.com/mentos-team/MentOS <clone_directory>
cd <clone_directory>

Creiamo una nuova cartella chiamata build che verrà utilizzata da CMake per scrivere file di configurazione per il building e per la compilazione.

mkdir build && cd build
cmake ..
Se durante il processo incontriamo degli errori, niente panico. La maggior parte delle volte è un problema con qualche pacchetto obsoleto e/o mancante. Google è tuo amico.

Procediamo con la compilazione (richiede un paio di minuti):

make

Lanciamo make qemu per iniziare a testare MentOS su una macchina virtuale.

Per compilare MentOS tutte le successive volte, sarà necessario solo eseguire il comando make all’interno della cartella build.

Complimenti, avete compilato un sistema operativo!

Next steps

Le prossime sezioni sono dedicate a chi vuole fare qualche passo in più.

Cambiare algoritmo di scheduling

MentOS al suo interno implementa diversi algoritmi di scheduling e dà la possibilità all’utente di specificarne uno in particolare durante il processo di compilazione. Per cambiare algoritmo di scheduling, è sufficiente andare nella cartella build/ e riconfigurare cmake passando la flag -DSCHEDULER_TYPE con il nome dell’algoritmo di scheduling.

Esempio:

# Round Robin scheduling algorithm
cmake -DSCHEDULER_TYPE=SCHEDULER_RR ..
# Priority scheduling algorithm
cmake -DSCHEDULER_TYPE=SCHEDULER_PRIORITY ..
# Completely Fair Scheduling algorithm
cmake -DSCHEDULER_TYPE=SCHEDULER_CFS ..

Successivamente, eseguire make per la compilazione e make qemu per il testing su macchina virtuale.

Debug

Per aprire l’interfaccia di debug, è sufficiente eseguire il comando make qemu-gdb all’interno della cartella build. Si apriranno tre diverse finestre: il booting del kernel su qemu, una shell con i messaggi di debug e cgdb pronto per fermare/modificare il debug.

Risoluzione problemi più comuni

Warning su Cmake: CMP0037

  CMake Warning (dev) at programs/CMakeLists.txt:114 (add_custom_target):

  Policy CMP0037 is not set: Target names should not be reserved and should
  match a validity pattern.  Run "cmake --help-policy CMP0037" for policy
  details.  Use the cmake_policy command to set the policy and suppress this
  warning.

  The target name "help" is reserved or not valid for certain CMake features,
  such as generator expressions, and may result in undefined behavior.

La commit 5363v115bf introduce il comando help basandosi su un programma chiamato per l’appunto help. Quando si esegue "cmake ..", tutti i programmi dentro la cartella programs/ vengono aggiunti su CMake come comandi (per poter fare successivamente make nome_programma), però secondo la policy CMP0037, alcuni comandi sono riservati (come install, build), compreso help ed ecco spiegato il warning.

Il warning può essere ignorato (anche se in release più recenti di CMake potrà essere considerato un errore, abortendo la compilazione).

In ambienti Linux, non esiste /bin/help ma è una caratteristica built-in alla shell. Una patch per la risoluzione del problema è disponibile qui: fix-warning-cmake.diff. Per poter applicare la patch utilizzare git apply fix-warning-cmake.diff.

Unable to init server con QEMU

Unable to init server: Could not connect: Connection refused
qemu-system-i386: multiboot knows VBE. we don't

Molto probabilmente non avete installato/configurato/abilitato l’ambiente grafico per qemu. Questo accade se siete su WSL (il subsystem di Windows per Linux) oppure se state accedendo alla macchina da modalità testuale.


  1. Le Mentos invece sono delle caramelle: prestare attenzione alle lettere in maiuscolo. Per compilare le Mentos è sufficiente un po’ di zucchero, sciroppo di glucosio, olio di cocco totalmente idrogenato, amido di mais, aromi naturali di menta, maltodestrina e alcuni addensanti: E418, E466, E414. ↩︎

Traduzioni