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
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 ..
Procediamo con la compilazione (richiede un paio di minuti):
make
Lanciamo make qemu
per iniziare a testare MentOS su una macchina virtuale.
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.