Il sistema operativo / Linux

Transcript

Il sistema operativo / Linux
Il sistema operativo / Linux
Non lasciate l’unica copia del programma sul PC in cui lavorate, non è detto che lo possiate riutilizzare
durante la lezione successiva.
Create una directory (ad es. chiamandola con il vostro cognome) e salvate al suo interno i file che
preparerete. Non chiamate i file dei programmi tutti con lo stesso nome (pippo.c / test.c / prova.c / …)
I computer potrebbero bloccarsi: salvate SPESSO il file con il codice C.
Alla fine della lezione COPIATE i file che avete preparato su di un floppy o su una memoria USB (oppure
spediteveli per posta elettronica)
Come faccio a spostare i documenti che ho creato su floppy/memoria USB?
1
Dal desktop del PC individuo la cartella che contiene il file, lo seleziono e lo copio
all’interno della cartella che si trova nel floppy o nella memoria USB (dopo averla
montata)
Il sistema operativo / Linux
2
Utilizzando il comando df individuo quali siano i dispositivi di memorizzazione
attualmente disponibili e capisco quale sia la directory in cui sia disponibile il loro
contenuto. Di norma, il contenuto del floppy è disponibile all’interno della directory
/mnt/floppy
mentre il contenuto della memoria USB è disponibile all’interno della directory
/mnt/usb
oppure, nel caso ci siano più porte USB disponibili, nella directory
/mnt/usb/1
!!
Per chi ha scelto il metodo 1, utilizzare l’opzione smonta prima di scollegare il dispositivo
Per chi ha scelto il metodo 2, dare il comando
umount /mnt/floppy
umount /mnt/usb
nel caso si stia usando il dischetto
nel caso si stia usando la memoria USB
Il sistema operativo / Linux
Perché devo montare/smontare la chiavetta USB ed i floppy ?
memorizzazione di dati da parte dell’utente / software / alto livello
?
periferica di archiviazione / hardware / basso livello
utente
dispositivo
software
(file)
buffer di MEMORIA
I dispositivi hardware non sono direttamente accessibili all’utente, il sistema operativo ne permette
l’accesso all’utente mediante dei collegamenti ai dispositivi hardware che vengono visti dall’utente
come dei file. -> diamo un’occhiata alla directory /dev (ove dev sta per device)
dispositivo hardware
(ad es. memoria USB)
rientrano nella categoria
block devices
supportano RA
Il compilatore / Linux
Il compilatore, gcc
http://gcc.gnu.org/
(GNU C Compiler)
Perché ci serve un compilatore ?
Il compilatore serve in quanto il C è un linguaggio compilato e non interpretato; il C inoltre è un
linguaggio imperativo.
Ci serviamo del compilatore per passare dal file di testo (linguaggio C / comprensibile all’utente) a
programma eseguibile (linguaggio macchina/comprensibile al processore).
Ci sono livelli di linguaggio intermedi? Sì!
Codice C, linguaggio comprensibile con un lessico, sintassi e semantica
int i = 5;
i = i + 3;
Assembly (linguaggio mnemonico a basso livello)
Linguaggio macchina (codice binario)
… 0101011000101001001010 …
compilatore
Il compilatore / Linux
Quali sono le operazioni svolte dal compilatore per tradurre il codice in un file eseguibile?
Riconduciamoci prima ad un esempio semplice: vogliamo un programma che funzioni sulla macchina
“cuoco” e che ricevendo in input degli ingredienti ci produca come output una torta.
Listato del codice
Pasta al forno
-
5 hg di pasta corta
300 g di sugo al ragù
200 g di besciamella
parmigiano
burro
Cuocere la pasta in acqua salata
(tenendola al dente); scolare e
condire con il sugo. Disporre poi
in una teglia precedentemente
imburrata e ricoprire con la
besciamella e parmigiano a
piacere. Passare in forno a 180 oC
fino a raggiungere la doratura
desiderata. Come variante, al
posto del ragù usare il sugo con i
funghi.
Cosa dovrà poi fare il programma?
allocazione delle risorse
salare l’acqua e farla bollire
cuocere la pasta
condire la pasta
accendere il forno / T = 180 oC
prendere la teglia e imburrarla
riempirla di pasta
ricoprire con besciamella
aggiungere parmigiano
infornare il tutto
controllare il livello di cottura
estrarre a cottura ultimata
commento (ovvero testo non funzionale
alla produzione di questo specifico output)
Il compilatore / Linux
Cosa dovrà poi fare il programma?
Cosa sa fare la macchina?
allocazione delle risorse
salare l’acqua
farla bollire e cuocere la pasta
condire la pasta
prendere la teglia e imburrarla
riempirla di pasta
ricoprire con besciamella
aggiungere parmigiano
infornare il tutto
controllare il livello di cottura
estrarre a cottura ultimata
NO -> il cuoco rimane in cucina
ok
NO -> serve libreria esterna per uso di pentole e fornello
ok
ok
ok
ok
ok
NO -> serve libreria esterna per uso del forno e cottura
ok
ok
Il programma finale (che è in grado di produrre come output la pasta al forno) risulta quindi l’insieme di:
allocazione delle risorse, operazioni svolgibili direttamente dalla macchina che lo dovrà eseguire,
operazioni svolgibili dalla macchina mediante l’ausilio di funzionalità esterne alla macchina stessa.
Il compilatore / Linux
Il compilatore deve rendere possibile l’esecuzione del programma, ovvero deve:
1.
eliminare i commenti (sono superflui per le operazioni da svolgere)
2.
sostituire le etichette; ovvero “parmigiano” deve diventare “100 gr di parmigiano della marca ACME,
pasta deve diventare “500 gr di fusilli della marca ACME”
3.
generare il codice eseguibile dalla macchina (prendi la scatola di pasta, aprila, togli la pasta dalla
scatola, pesala, ...)
4.
collegare il codice legato all’interazione con dispositivi o funzionalità esterne (accendi il forno,
imposta la temperatura, ...)
5.
includere nel programma una parte in cui si richieda l’allocazione delle risorse utili al funzionamento
del programma (ovvero richiedere quanti e quali ingredienti debbano essere tutti disponibili nel
momento in cui il programma verrà mandato in esecuzione)
6.
unire il tutto e fare in modo che le varie istruzioni vengano concatenate in modo corretto (non devo
mettere in forno la pasta prima di averla cotta...)
Il sistema operativo deve rendere attuabile l’esecuzione del programma, ovvero deve:
1.
fare in modo che le risorse richieste vengano rese disponibili al momento dell’inizio del programma
(se manca la pasta, il programma non parte)
2.
fare in modo che i dispositivi esterni e le funzionalità siano disponibili al momento dell’esecuzione
del programma (se manca il gas, il forno non si accende)
Il compilatore / Linux
Il compilatore, gcc
(GNU C Compiler)
http://gcc.gnu.org/
1.
salviamo il programma in un file di testo avente estensione .c, ad esempio esempio.c
2.
serviamoci del compilatore per passare dal file di testo (linguaggio C / comprensibile all’utente) al
programma eseguibile (linguaggio macchina/comprensibile al processore).
gcc -o esempio -Wall esempio.c
-o
-Wall
dopo questa opzione va indicato il nome del file (sta per –output)
in cui il compilatore salverà il file da lui prodotto (in questo caso esempio)
W sta per warning, l’opzione serve per attivare tutti (all) gli avvisi possibili
NOTA! il file può avere un nome qualsiasi, non serve abbia un’estensione particolare
3.
mandiamo in esecuzione il file eseguibile
./esempio
Come mai dobbiamo anteporre ./ al nome del file eseguibile?
Per motivi di sicurezza il sistema operativo manda in esecuzione in modo automatico solo i file
eseguibili che si trovano in un elenco prestabilito di directory. Tutti gli altri file si possono mandare
in esecuzione a patto di specificarne esattamente la posizione.
4.
controlliamo che il file eseguibile abbia i privilegi per poter essere mandato in esecuzione
utilizziamo il comando
Il compilatore / Linux
ls -al
dovremmo vedere che, mentre il file esempio.c possiede i privilegi rw-, il file esempio possiede
tutti e tre i privilegi, rwx
Il compilatore / Linux
Prima di iniziare a scrivere un programma …
Ordine! abituatevi a progettare il codice su un foglio di carta, anche se si tratta di poche
righe o di qualcosa che ritenete essere banale. Fate in modo che l’indentazione del
codice rispecchi la sua struttura.
Aggiungete dei commenti (con moderazione...)
Una sintassi corretta ma priva di significato non produce un buon algoritmo (anzi,
spesso si ottengono dei danni!). Il compilatore controlla la sintassi ed il lessico,
purtroppo/per fortuna non controlla la semantica.
Imparate dagli sbagli; se il compilatore genera un errore o un warning (la lingua del
compilatore è l’inglese!), ricordiamocene ed impariamo a riconoscerlo
Fate dei test man mano che scrivete il codice, non aspettate di verificarne la funzionalità
dopo aver scritto pagine e pagine.
Ragionate!!
Divertitevi!!
Il compilatore / Linux
Cominciamo con un esempio semplice, cercando di seguire i passi della compilazione.
Supponiamo che il codice venga salvato in un file che si chiama primo_test.c
Prima di tutto verifichiamo la correttezza del codice mediante il compilatore
gcc –o primo_test –Wall primo_test.c
Se non vengono osservati errori, cerchiamo di analizzare quali sono i passaggi che ci portano dal codice
C al file scritto in linguaggio binario.
Verifichiamo il primo passo: l’azione del preprocessore (punti 1 e 2 della ricetta della pasta al forno)
gcc –E primo_test.c
Con questo comando mandiamo a video il risultato dell’azione del preprocessore; con l’operatore di
redirezione possiamo anche mandare su file tale output
gcc –E primo_test.c > risultato_preprocessore
Ora vediamo come è fatto un file scritto in assembly (punto 3 (in parte) della ricetta della pasta al forno)
gcc –S primo_test.c
Otteniamo un file che si chiama primo_test.s -> visualizziamone il contenuto con un editor di testo
Proviamo ora a dare un’occhiata al file primo_test …