Soluzioni degli esercizi

Lezione 6
Analisi del codice
Sistemi Operativi (9 CFU), CdL Informatica, A. A. 2014/2015
Dipartimento di Scienze Fisiche, Informatiche e Matematiche
Università di Modena e Reggio Emilia
http://weblab.ing.unimo.it/people/andreolini/didattica/sistemi-operativi
1
Quote of the day
(Meditate, gente, meditate...)
“UNIX gives you just enough
rope to hang yourself – and
then a couple more feet, just
to be sure. ”
Eric Allman (1955-)
Programmatore
Autore di Sendmail e Syslog
2
Esercizi (3 min.)
1. Scaricare il codice sorgente del pacchetto
software riguardante le utilità di base.
3
Soluzioni
1. Si ricordi che le utilità di sistema sono
contenute nel pacchetto binario coreutils.
Per scaricare il relativo pacchetto sorgente si dia
il seguente comando:
apt-get source coreutils
4
Esercizi (3 min.)
2. Scaricare il codice sorgente del pacchetto
software riguardante la libreria del C.
5
Soluzioni
2. Si ricordi che le utilità di sistema sono
contenute nel pacchetto binario libc6. Per
scaricare il relativo pacchetto sorgente si dia il
seguente comando:
apt-get source libc6
6
Esercizi (5 min.)
3. Scaricare il codice sorgente del pacchetto
software riguardante il kernel Linux.
7
Soluzioni
3. Quali pacchetti binari contengono kernel? Si
dia il comando seguente per visualizzarli:
apt-cache search '^linux-image.*$'
Su macchine a 64 bit è presente il pacchetto
binario linux-image-3.2.0-4-amd64 che
fornisce la versione esatta del kernel in Debian.
Si scarichi il relativo pacchetto sorgente:
apt-get source linux-image-3.2.0-4-amd64
8
Esercizi (3 min.)
4. Identificare il nome del pacchetto Debian
contenente il sistema di controllo delle revisioni
GIT.
5. Installare tale pacchetto Debian.
9
Soluzioni
4. Si cerchino i pacchetti software che iniziano
con la stringa git:
apt-cache search '^git.*$'
Si dovrebbe riuscire ad individuare un
pacchetto software dal nome git.
5. Si installi il pacchetto software individuato:
apt-get install git
10
Esercizi (3 min.)
6. Si scarichi il repository GIT di coreutils.
11
Soluzioni
6. Si individua la home page del progetto GNU
coreutils:
http://www.gnu.org/software/coreutils
Si identifica la sezione “Latest Source” e si copia il
comando di clonazione del repository.
git clone git://git.sv.gnu.org/coreutils
12
Esercizi (5 min.)
7. Il comando precedente può fallire. È fallito? Se
sì, sapreste dire il perché?
13
Soluzioni
7. Il protocollo di comunicazione “git” può essere filtrato
dal firewall di ateneo. Se capita ciò, è possibile usare il
protocollo “http”, che di solito non è filtrato.
Per conoscere l'URL del repository GIT servito dal
protocollo HTTP, si clicca il link “gitweb” che punta alla
sua rappresentazione Web-based. I tre valori del campo
“URL” contengono gli URL corretti con i diversi protocolli.
Per HTTP:
http://git.savannah.gnu.org/r/coreutils.git
→ Il comando corretto per la clonazione del repository
via HTTP è il seguente:
14
git clone http://git.savannah.gnu.org/r/coreutils.git
Esercizi (2 min.)
8. Si visualizzino le differenze fra l'ultima e la
penultima versione delle coreutils.
15
Soluzioni
8. Le differenze possono essere visualizzate così:
git log -p HEAD^ HEAD
16
Esercizi (5 min.)
9. Usando l'indicizzatore Web-based del kernel, si
trovi il simbolo:
init_uts_ns
Secondo voi, di che cosa è responsabile tale
simbolo?
17
Soluzioni
9. Si cerca il simbolo init_uts_ns con lo strumento di
ricerca degli identificatori. Si scopre che è una struttura
dati.
Cliccando sulle costanti definite nel campo name si
scopre che in tale struttura sono memorizzate le
informazioni sulla versione del kernel recuperate con il
comando uname.
Nota bene: alcune costanti generate al volo durante la
compilazione del kernel (ad es., il nome dell'host) e
potrebbero non essere disponibili.
18
Esercizi (10 min.)
10. Trovare la definizione della funzione
do_copy() e capire a che cosa serve.
Suggerimento: in che file si trova?
11. Quali funzioni invoca la do_copy()?
12. Quali funzioni invocano la do_copy()?
19
Soluzioni
10. Si apre cscope e si usa la funzione “Find this
global definition” (trova la definizione di un
simbolo). La do_copy() si trova in src/cp.c
(fa parte del comando cp). Essa effettua la copia
da una sorgente ad una destinazione.
20
Soluzioni
11. Si apre cscope e si usa la funzione “Find
functions called by this function” (trova le
funzioni invocate da questa funzione).
12. Si apre cscope e si usa la funzione “Find
functions calling this function” (trova le funzioni
che invocano questa funzione).
21