Nuova ricerca

Paolo VALENTE

Ricercatore Universitario
Dipartimento di Scienze Fisiche, Informatiche e Matematiche sede ex-Matematica

Insegnamento: Kernel hacking

Informatica (Offerta formativa 2024)

Obiettivi formativi

In questo corso imparate a sviluppare codice, a livello professionale, all'interno di un sistema operativo open source (Linux). Più in dettaglio, imparate l'intero ciclo di sviluppo: analisi del problema, progettazione di una soluzione, implementazione, collaudo, profiling, strumentazione del codice, debugging, preparazione della documentazione, sottomissione della soluzione alla comunità, gestione dell'interazione con i maintainer e la comunità. Durante il corso affrontate tutti questi passaggi in pratica, in modo graduale e con il costante aiuto del docente. Alla fine del corso avrete completato la preparazione di un vostro contributo reale per la comunità.

Prerequisiti

Conoscenze di base del funzionamento di un sistema operativo, meglio se direttamente di Linux. Ad esempio, le conoscenze fornite nel corso di Sistemi Operativi della nostra Laurea Triennale sono più che sufficienti.

Programma del corso

Il corso procede su due binari paralleli
1. fornitura delle basi necessarie per lo sviluppo nel kernel (teoria)
e, sin da subito, (3 crediti, 21 ore)
2. sviluppo all'interno del kernel Linux (pratica). (3 crediti, 21 ore)

In quanto alla teoria, i passaggi fondamentali saranno i seguenti.

- Partiremo da una panoramica del livello (layer), all'interno del kernel Linux, all'interno del quale lavoreremo: il block layer. La scelta è ricaduta sul block layer perché è la parte su cui al momento ho la maggiore competenza.
- Poi introdurremo lo scheduler dell'I/O BFQ, che con alta probabilità sarà la parte che andremo a modificare durante il corso. In particolare, analizzeremo BFQ partendo dall'algoritmo e le sue proprietà, e poi scendendo sempre più in basso, fino alle funzioni attraverso cui BFQ fornisce i suoi servizi al kernel.

In quanto alla pratica, faremo i seguenti passi, per i quali cui vi aiuterò costantemente ed in ogni aspetto.

- Inizieremo dal rivedere assieme le operazioni di base per la compilazione e l'installazione di un kernel
- Impareremo le procedure seguite dai programmatori professionisti col sistema di controllo di versione git
- Faremo la nostra prima esperienza pratica, attraverso una nostra prima modifica 'giocattolo' del kernel
- Impareremo ad eseguire debugging e profiling attraverso tracing, kernel OOPS e strumentazione del codice
- Impareremo a creare commit e patch di qualità, documentazione inclusa, ed a sottomettere contributi individuali o di gruppo alla comunità Linux

In particolare, da circa metà del corso la classe sarà divenuta a tutti gli effetti un piccolo team di sviluppo professionale, che preparerà e sottometterà alla comunità Linux dei contributi individuali o di gruppo. Quindi interagirete sia direttamente col docente, che con i vostri colleghi.
Trovate esempi di tali contributi, e dell'impegno temporale che hanno richiesto, in fondo alla descrizione dell'esame pratico.

Metodi didattici

Come descritto in dettaglio nella sezione "Contenuto del corso", il metodo didattico è una vera e propria fusione di lezioni frontali ed esercitazioni in laboratorio. Pertanto l'intero corso è tenuto in laboratorio.

Il corso è erogato in lingua italiana in presenza. La frequenza non è obbligatoria, ma fortemente consigliata. Gli studenti lavoratori sono invitati a contattare il docente.

Testi di riferimento

Consultare la pagina del corso: http://algogroup.unimore.it/people/paolo/courses/kernel-hacking/

Verifica dell'apprendimento

L'esame sarà una naturale espressione di quanto appreso nel corso, ossia consisterà in:
- cercare di risolvere un piccolo problema del block layer;
- trasformare la propria soluzione in un 'pacchetto' pronto per la distribuzione, ossia nel preparare una o più patch contenenti tale soluzione;
- distribuire e proporre tale contributo attraverso il canale appropriato, ossia sottomettere in modo opportuno tale/tali patch alla comunità.

Fornire un contributo reale di questo tipo, per quanto piccolo, ha degli aspetti impegnativi:
- dover fronteggiare una complessità maggiore rispetto alla realizzazione di un progetto giocattolo, con sole finalità didattiche;
- non avere a disposizione un manuale di riferimento in cui trovare la risposta per qualsiasi dubbio;
- con molta probabilità, dovere chiedere aiuto a me di tanto in tanto; in merito, avrete totale disponibilità da parte mia.

Date queste difficoltà, non sarà necessario un lavoro perfetto per ottenere il voto massimo.

Infine, per avere un'idea più precisa del tipo di contributi attesi e dei tempi richiesti, controllate la parte finale della descrizione delle modalità d'esame sul sito del corso:
http://algogroup.unimore.it/people/paolo/courses/kernel-hacking/

Il criterio di valutazione per l'assegnazione del voto sarà fondamentalmente la qualità del codice e della documentazione. Non ci saranno punteggi assegnati a componenti specifiche, il voto finale dipenderà dal contributo nel suo complesso.

Risultati attesi

Alla fine del corso, avrete una visione organica di tutte le fasi dello sviluppo professionale di codice all'interno di un sistema operativo open source:
- analisi del problema
- progettazione di una soluzione
- implementazione
- collaudo
- profiling
- strumentazione del codice
- debugging
- documentazione
- sottomissione della soluzione alla comunità

Ancora meglio, metterete in pratica molte di tali fasi nello sviluppo di un vostro reale contributo per la comunità.

- Conoscenza e capacità di comprensione: al termine del corso lo studente avrà le conoscenze di base relative alla modifica di un sistema operativo moderno, multiprogrammato, a condivisione di tempo.

- Capacità di applicare conoscenza e comprensione: al termine del corso lo studente sarà in grado di applicare queste conoscenze a problemi di valutazione delle prestazioni e modifica del codice di software GNU/Linux.

- Autonomia di giudizio: al termine del corso lo studente sarà in grado di riconoscere in modo autonomo i diversi approcci e metodi risolutivi per le problematiche tipiche dei moderni sistemi operativi e saranno in grado di relazionare oralmente e per iscritto sugli argomenti presentati nel corso con un linguaggio tecnico appropriato.

- Capacità di apprendimento: lo studio permetterà lo sviluppo di abilità di apprendimento autonomo e di approfondimento di argomenti collaterali a quelli presentati nel corso: la comprensione e la modifica delle principali aree di un sistema operativo (scheduler, gestore di memoria, gestore di I/O).