Diario delle lezioni
Questa pagina riporta l’elenco e i contenuti delle lezioni, tutte da 180 minuti svolte in aula 208 del’edificio Marco Polo.
[L01] Lunedì 25 febbraio 2019 (Demetrescu C1) e martedì 26 febbraio 2019 (Coppa C2)
- Illustrazione modalità corso ed esercitazioni
- Pipeline compilazione
gcc
(-E
, -c
, -S
, -o
)
- Linguaggio assembly vs. linguaggio macchina (codice binario)
- Tool
objdump -d
per disassemblare codice binario
- Spiegazione layout memoria segmento eseguibile con istruzioni giustapposte con formato variabile
- Esempio di scrittura di file
.s
,
- Comando
file
per analizzare il tipo di file
- Primi elementi di sintassi assembly AT&T:
- Traduzione C->IA32: assegnamento
- istruzione
mov
e suffisso l
(movl
) per indicare movimento di 4 byte da sorgente a destinazione
- letterali costanti
$
- Traduzione C->IA32: ritorno da funzione
- istruzione
ret
- registro
%eax
come valore di ritorno a 32 bit
- Materiale didattico:
[L02] Mercoledì 27 febbraio 2019 (Demetrescu C1) e giovedì 28 febbraio 2019 (Coppa C2)
- Nozione ISA (es. IA32 vs. AMD64/x86-64/x64)
- Focus su sintassi AT&T, cenni sintassi Intel
- Registri interi a 32 bit (general-purpose e speciali):
A
, B
, C
, D
, SI
, DI
, BP
, SP
- Struttura generale delle istruzioni IA32 binarie e unarie, operandi sorgente e destinazione
- Operandi immediati, registro e memoria
- Corrispondenza suffissi IA32 e tipi (
b
, w
, l
)
- Operatori logici (
not
, and
, or
, xor
) e aritmetici (neg
, add
, sub
, imul
, inc
, dec
)
- Vincoli su operandi (es. destinazione
imul
solo registro)
- Traduzione C->IA32: calcolo di espressioni aritmetiche
- Traduzione C->IA32: accesso ai parametri passati a una funzione
- registro
%esp
(stack pointer), layout della stack caller-callee, indirizzo di ritorno
- modo di indirizzamento registro con spiazzamento
d(%esp)
- Esempi
- Materiale didattico:
[T01]: Venerdì 1 marzo 2019 - Coppa/Demetrescu
- Traduzione C->IA32: funzioni che calcolano espressioni intere, accesso ai parametri passati,
- Palestra esercizi C
- Quiz su rappresentazione esadecimale e toolchain gcc
- Testo, software e soluzioni esercitazione
[L03] Lunedì 4 marzo 2019 (Demetrescu C1) e martedì 5 marzo 2019 (Coppa C2)
- Istruzioni di salto incondizionato (istruzione
jmp
) e condizionato (famiglia jcc
)
- Etichette che denotano indirizzi (target di salti)
- Traduzione di schemi
if
, if ... else
e while
in forma if ... goto
direttamente traducibile in IA32
- Cenni a registro
EFLAGS
e suo ruolo nel registrare informazioni che collegano azioni effettuate da operazioni aritmetico-logiche e successive istruzioni di salto condizionato.
- Condition code relative al risultato della precedente istruzione aritmetico-logica:
e
, ne
, l
, le
, g
, ge
, a
, ae
, b
, be
(signed e unsigned). Non trattate condizioni che definiscono i condition code in funzione dei bit ZF, OF, CF, ecc, di EFLAGS (fuori degli obiettivi del corso).
- Cenni a Equivalenza
e
<->z
e ne
<->nz
- Pattern
sub-jcc
, cmp-jcc
, test-jcc
.
- Rappresentazioni big-endian e little-endian.
- Ripasso tra cifre esadecimale e loro rappresentazione binaria.
- Esercizi svolti in classe.
- Materiale didattico:
[L04] Mercoledì 6 marzo 2019 (Demetrescu C1) e giovedì 7 marzo (Demetrescu C2) [180 min]
- Uso di puntatori: modi di indirizzamento indiretto a registro con base, indice, scala e spiazzamento.
- Aritmetica dei puntatori.
- Uso di stringhe C.
- Esercizi svolti in classe.
- Materiale didattico:
[T02]: venerdì 8 marzo 2019 (120 min - Demetrescu/Massarelli)
[L05] Lunedì 11 marzo 12 2019 (Coppa C1) e martedì 12 marzo 2019 (Coppa C2)
- ABI (Application Binary Interface)
- Calling convention System V: registri callee-save e caller save, istruzioni PUSH, POP (semantica e uso)
- Chiamata e ritorno da funzione -> istruzioni CALL e RET (semantica e uso)
- Passaggio dei parametri -> allocazione della memoria nello stack frame
- Promozione intera nel passaggio dei parametri in C -> accesso a 32 bit ai parametri formali di tipo char e short in IA32
- Conversioni di tipo intero (type cast) -> istruzioni MOVZ e MOVS
- Esercizi svolti in classe
- Materiale didattico:
[L06] Mercoledì 13 marzo 2019 (Coppa C1) e giovedì 14 marzo 2019 (Coppa C2)
- Variabili locali -> allocazione della memoria nello stack frame e allineamento %esp a 4 byte
- Accenno ad allineamento a 16 byte per %esp a causa di istruzione vettoriali
- Istruzione LEA per il calcolo di indirizzi ed espressioni: esempio del calcolo di indirizzi di variabili locali in stack e calcolo di espressioni aritmetiche
- Espressioni booleane -> istruzione SETcc
- Consultazione del manuale Intel (ISA, Volume 2: Instruction Set Reference)
- Esercizi svolti in classe
- Esercizio per casa: tradurre in IA32 la funzione
merge
in E5
, postare la soluzione sul forum
- Materiale didattico:
[T03]: venerdì 15 marzo 2019 (120 min - Coppa/Massarelli)
- Chiamate a funzione con e senza passaggio dei parametri
- Registri caller-save e callee-save
- Uso delle istruzioni
SETcc
, MOVS
e MOVZ
- Chiamate funzioni
libc
da codice assembly
- Palestra esercizi C
- Quiz su registri caller-save e callee-save, istruzioni TEST, LEA, SETcc, CMOVS, CMOVZ
- Testo, software e soluzioni esercitazione
[L07] Lunedì 18 marzo 2019 (Coppa C1) e martedì 19 marzo 2019 (Coppa C2)
struct
in C e sue regole di allineamento e padding [rif]
- Allocazione di array statici in stack
- Uso del debugger gdb per l’analisi di programmi misti C/assembly IA32 (comandi base):
- comando custom
go
definito attraverso ~/.gdbinit
)
- comandi
step
, next
, run
, break
, delete
, finish
, p
, x
- Esercizi svolti in classe
- Materiale didattico:
[L08] Mercoledì 20 marzo 2019 (Coppa C1) e giovedì 21 marzo (Coppa C2)
- Assegnamento condizionato con istruzione CMOV
- Shift logico SHL/SHR ed aritmetico SAL/SAR: applicazione su rappresentazioni con e senza segno, moltiplicazione e divisione intera per 2^S
- Divisione intera
IDIV
- Vincoli su alcune istruzioni (IMUL, CMOV, TEST, CMP, MOVZ/MOVS)
- Accenni sull’uso registro
ebp
per la gestione della stack (base pointer)
- Esercizi svolti in classe
- Materiale didattico:
[T04]: Venerdì 22 marzo 2019 (120 min Coppa/Demetrescu/Massarelli)
- Uso di
struct
in C e sue regole di allineamento e padding: caso di studio delle liste collegate
- Palestra esercizi C
- [Testo, software e soluzioni esercitazione](training/lab/T04-190322.html
[L09] Lunedì 25 marzo 2019 (Demetrescu C1) e martedì 26 marzo 2019 (Demetrescu/Ciccotelli C2)
- Esercizi ripilogativi su IA 32
[L10] Mercorledì 27 marzo 2019 (Demetrescu C1) e Giovedì 28 marzo 2019 (Ciccotelli C2)
- Discussione questionario qualità corso mese 1
- Ottimizzazionie dell’uso delle risorse come
moneta
per comprare
altre qualità del software
- Motto: un programma velocissimo ma errato è completamente inutile.
- Ottimizzaione dei programmi: ottimizzazioni algorithmiche e corrimizzazione del codice
- ottimizzazioni da parte del compilatore (-O1, -O2, ecc.) e del programmatore
- ottimizzazioni classiche dei compilatori: constant folding, constant propagation, common subespression elimination, loop-invariant code motion (LICM)
- analisi di LICM: casi in cui cui può essere effettuato dal compilatore casi in cui deve essere applicato (con cura) dal programmatore.
- Materiale didattico:
[T05]: Venerdì 29 marzo 2019 (120 min Ciccotelli/Demetrescu/Massarelli)
- Allocazone di strutture/buffer in stack.
- Istruzioni CMOV, shift, divisione intera.
- SHL/SHR ed aritmetico SAL/SAR: applicazione su rappresentazioni con e senza segno, moltiplicazione e divisione intera per 2^S
- Divisione intera IDIV
- Vincoli su alcune istruzioni (IMUL, CMOV, TEST, CMP, MOVZ/MOVS)
- Palestra esercizi C
- Testo, software e soluzioni esercitazione
[L11] Lunedì 1 aprile 2019 (Ciccotelli C1) e martedì 2 aprile 2019 (Ciccotelli C2)
- ulteriori tecniche di ottimizzazione del work
- augmentation
- loop unrolling
- algebraic identities
- cortocircuitazione
- compile-time initialization con lookup table
- esempio: verifica lettera consonante (alla lavagna)
- esempio: E2-factorization (al computer)
- utilizzo del comando “time”
- riduzione del costo delle istruzioni
- register allocation
- strength reduction
- allineamento dei dati in memoria
- riduzione dello spazio in memoria
- riduzione dello spazio occupato dal codice (gcc -Os)
- riduzione dello spazio occupato dai dati
- ottimizzazione dello spazio richiesto dalle struct C
- dove intervenire per ottimizzare
- definizione di speedup
- legge di Amdahl e speedup massimo
- identificazione dei colli di bottiglia tramite performance profiler
- utilizzo di gprof
- esempio: E1-gprof
- analisi del report di gprof (call graph)
- Materiale didattico:
[L12] Mercoledì 3 aprile 2019 (Demetrescu C1) e giovedì 5 aprile 2019 (Ciccotelli C2)
- Intervallo per presentazione piano di studi 1h [C1]
- Esercizi x86 svolti 1h [C2]
- Differenza fra esecuzione utente e supervisore (user e system, protected, privileged)
- Funzioni di libreria che girano interamenete in user mode (es.strlen) e funzioni che vengono eseguite in modo misto (es. printf)
- Panoramica di alto livello su standard POSIX (IEEE 1003, ISO/IEC 9945): differenza tra C standard, system call, coreutil
- Materiale didattico:
[T06]: Venerdì 5 aprile 2019 (120 min Ciccotelli/Demetrescu/Massarelli)
[L13] Lunedì 8 aprile 2019 (Demetrescu C1) e martedì 9 aprile 2019 (Ciccotelli C2)
- Convenzioni di errore POSIX.
- Variabile
errno
.
- Comando
man
, capitoli 1 (cmd), 2 (syscall), 3 (libraries, es. glib)
- Consultazione documentazione online
opengroup
.
- Esempi uso istructione trap
INT 0x80
:
- compilazione con gcc
-nostdlib
- scrittura programma kamikaze che effettua subito la terminazione del processo (modalità
-nostdlib
)
- scrittura wrapper syscall per
write
.
- Mutazione di un processo mediante
execvp
- Creazione di un processo figlio mediante
fork
- Attesa di un processo figilo mediante
wait
- Materiale didattico:
[L14] Mercoledì 10 aprile 2019 (Demetrescu C1) e giovedì 11 aprile 2019 (Ciccotelli C2)
- separazione dello spazio di memoria di genitore e figlio dopo
fork
- gestore terminazione atexit, puntatori a funzione in C (cenni)
- chiamate libc
_exit
vs exit
- buffering della libc (
newline
, setbuf
, fflush
) ed effetti del buffering sull’output di processi che usano fork
- [Aside: flusso del controllo eccezionale. Interrupt: traps, faults, aborts, interrupt intenzionali e intenzionali, sicroni e asincroni]
- [Aside: PCB, context switch su interrupt timer (illusione execuzione simultanea e sua performance penalty), scheduling Round-Robin, stati classici di un processo, dispatcher come selettore del successivo processo da schedulare (cenni)]
- Materiale didattico:
[T07]: Venerdì 12 aprile 2019 (120 min Ciccotelli/Massarelli)
[L15] Lunedì 15 aprile 2019 (Ciccotelli C1) e martedì 16 aprile 2019 (Ciccotelli C2)
- File system
- directory, file e albero delle directory
- percorso assoluto/relativo
- comandi esplorazione file system e creazione/eliminazione file (pwd, cd, ls, touch, mv, cp, mkdir, rmdir)
- permessi dei file (user, group, other)
- notazione
rwxrwxrwx
(es. ls -al)
- notazione ottale
- redirezione I/O da terminale (
>
, >>
, <
, >&
, &>
) e pipe (|
)
- Manipolazione file
- concetto di file descriptor
- tabella dei descrittori di file
- file descriptor 0, 1, 2 (standard input, output e error)
- accenno a comando
lsof
open
(combinazioni di flag
e mode
), read
, write
, close
, lseek (tell)
- valori di ritorno e variabile errno
- Materiale didattico:
[L16] Mercoledì 17 aprile 2019 (Ciccotelli C1) e martedì 30 aprile 2019 (Ciccotelli C2)
- Memoria virtuale
- Memoria logica e fisica
- Layout di memoria di un processo
- Esplorazione di
/proc/pid/maps
- Memory Management Unit (MMU)
- Paginazione
- Frame
- Tabella delle pagine
- Protezione
- Isolamento
- Protezione delle pagine (
mprotect
e cenni su mmap
)
- Cenni memoria condivisa
- Segmentation fault,
SIGSEGV
- Page fault
- Area di swap
- Thrashing
- Mapping indirizzi logici e fisici
- Dimensione tabella delle pagine e cenni su tabelle multi-livello
wait
e waitpid
- ispezione del parametro
status
tramite apposite macro (WIFEXITED(status)
, WEXITSTATUS(status)
, ecc.)
- processi zombie
ps
(cenni sintassi POSIX vs BSD: ps -eF
vs ps aux
)
- [Aside: Interrupt table, puntatori a funzione]
- Materiale didattico:
[L17] Lunedì 29 aprile 2019 (Demetrescu C1) e giovedì 2 maggio 2019 (Demetrescu C2)
- Invio e gestione dei segnali
- Comando
kill
e system call kill
- Gestione dei segnali con sigaction
- Timer con
alarm
e ualarm
mediante segnale SIGALRM
- Accenno alle regole di interpretazioni delle espressioni di tipo in C
- Materiale didattico:
[T08]: Venerdì 3 maggio 2019 (120 min Demetrescu/Ciccotelli/Massarelli)
[L18] Mercoledì 8 maggio 2019 (Demetrescu C1) e giovedì 10 maggio 2019 (Ciccotelli C2)
- Allocazione dinamica della memoria in spazio utente
- Anatomia di un semplice allocatore malloc/free
- Esempio di sequenza di malloc/free e configurazione heap corrispondente
- Discussione delle soluzioni alle domande dell’esercitazione T8
- Soluzione dell’esercizio della somma degli interi in un file con bufferizzazione (Esercizio 3 in P8)
- Materiale didattico:
[T09]: Venerdì 10 maggio 2019 (120 min Demetrescu/Ciccotelli/Massarelli)
[L19] Lunedì 13 maggio 2019 (Demetrescu C1) e martedì 14 maggio 2019 (Ciccotelli C2)
- Frammentazione interna ed esterna
- Valgrind: tool per l’analisi di bug nell’uso della memoria
- Esempio di codice che genera zombie
- Variabili di ambiente:
envp
come terzo parametro del main
setenv
, getenv
- layout dello stack frame del main (
argc
, argv
, envp
)
- comando
env
- comando
export
per la definizione di variabili d’ambiente nella shell
- definizioni permanenti di variabili d’ambiente nel file di configurazione
.bashrc
nella home directory dell’utente
- panoramica delle principali variabili d’ambiente (
PATH
, USER
, PWD
, ecc)
- cenni alla system call
execvpe
che carica un eseguibile passando al processo le variabili d’ambiente correnti
- Discussione domanda 3 esercitazione T9
- Esercizi svolti in classe su processi e file.
- Materiale didattico:
[L20] Mercoledì 15 maggio 2019 (Demetrescu C1) e giovedì 16 maggio 2019 (Ciccotelli C2)
- Memorie cache
- Politiche di rimpiazzo delle linee
- Associatività
- Esempi: somma e prodotto di matrici, studio dei cache miss di una sequenza di accessi a memoria
- Gerarchie di memoria
- Materiale didattico:
[T10]: Venerdì 17 maggio 2019 (120 min Demetrescu/Ciccotelli/Massarelli)
[L21] Lunedì 20 maggio 2019 (Demetrescu C1) e martedì 21 maggio 2019 (Ciccotelli C2)
- Categorie di cache miss: cold (compulsory), capacity, conflict
- Panoramica sull’architettura generale di un calcolatore: CPU, bus di sistema, I/O bridge, bus della memoria, bus I/O, adattatori, controller
- Differenza tra architetture RISC e CISC (cenni)
- Stadi dell’esecuzione di un’istruzione: modello semplificato a 5 stadi tipico dei processori RISC (fetch, decode, execute, memory, write-back)
- Concetto di ciclo di clock
- Pipelining:
- Funzionamento generale
- Hazard strutturali, sui dati e sul controllo
- Stalli e bolle
- Instruction scheduling per ridurre gli stalli
- Uso di istruzioni branchless per ridurre gli hazard sul controllo
- Discussione in classe di possibili domande di esame
- Materiale didattico:
[L22] Mercoledì 22 maggio 2019 (Demetrescu C1) e giovedì 23 maggio 2019 (Ciccotelli C2)
- Foto di fine anno
- Scala degli eventi di un sistema di calcolo
- Misurazione del tempo:
gettimeofday
vs. clock_gettime
- Risoluzione e latenza delle operazioni di misurazione
- Best practice nella misurazione delle prestazioni
- Discussione in classe di possibili domande di esame
- Materiale didattico:
[T11]: Venerdì 24 maggio 2019 (120 min Demetrescu/Ciccotelli/Massarelli)
[L23] Mercoledì 29 maggio 2019 (Demetrescu C1) e giovedì 30 maggio 2019 (Ciccotelli C2)
- Esercizi riepilogativi
- Materiale didattico:
[T12]: Venerdì 31 maggio 2019 (120 min Demetrescu/Ciccotelli/Massarelli)
A.A. 2014-2015 |
A.A. 2015-2016 |
A.A. 2016-2017 |
A.A. 2017-2018
]