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<->ze 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
]