Architetture Architetture dei dei Calcolatori Calcolatori
( (Lettere Lettere A A- -I) I) Assemblatore Assemblatore, Linker e Loader , Linker e Loader Prof. Francesco Lo Presti Prof. Francesco Lo Presti Assembler, Linker & Loader 2 Compilazione Compilazione Nella prima fase, il programma ad alto livello viene tradotto Nella prima fase, il programma ad alto livello viene tradotto nel linguaggio assembler utilizzando un apposito programma nel linguaggio assembler utilizzando un apposito programma detto detto compilatore compilatore Dopo la fase di compilazione, il programma scritto il Dopo la fase di compilazione, il programma scritto il linguaggio assembler viene tradotto in linguaggio macchina linguaggio assembler viene tradotto in linguaggio macchina utilizzando un apposito programma detto utilizzando un apposito programma detto assemblatore assemblatore (assembler) (assembler) Spesso con il termine compilazione si indica l Spesso con il termine compilazione si indica l intero processo intero processo di traduzione da linguaggio ad alto livello a linguaggio di traduzione da linguaggio ad alto livello a linguaggio macchina (essendo l macchina (essendo l assemblatore spesso integrato con il assemblatore spesso integrato con il compilatore) compilatore) Assembler, Linker & Loader 3 Il processo di compilazione Il processo di compilazione Il programma sorgente Il programma sorgente scritto in un linguaggio ad scritto in un linguaggio ad alto livello (ad es., C) alto livello (ad es., C) Il codice oggetto, scritto Il codice oggetto, scritto in linguaggio macchina, in linguaggio macchina, viene memorizzato su viene memorizzato su disco disco Il caricatore ( Il caricatore (loader loader) ) carica il programma in carica il programma in memoria principale per memoria principale per l l esecuzione esecuzione Programma sorgente Programma in linguaggio assembler hello.c compilatore hello.s Programma in linguaggio macchina (codice oggetto) hello.out assemblatore caricatore Programma in memoria Assembler, Linker & Loader 4 Il Il linker linker Il Il linker linker ( (link link editor o editor o collegatore collegatore) ha il compito di collegare tra ) ha il compito di collegare tra loro vari moduli che compongono lo stesso programma loro vari moduli che compongono lo stesso programma Programma sorgente suddiviso in pi Programma sorgente suddiviso in pi file che vengono compilati file che vengono compilati separatamente creando diversi file oggetto separatamente creando diversi file oggetto Utilizzo di funzioni di libreria Utilizzo di funzioni di libreria Il Il linker linker collega tra loro i file contenenti il codice oggetto dei collega tra loro i file contenenti il codice oggetto dei vari moduli che costituiscono il programma, unendovi anche il vari moduli che costituiscono il programma, unendovi anche il codice delle funzioni di libreria utilizzate, producendo un file codice delle funzioni di libreria utilizzate, producendo un file contenente il codice eseguibile, memorizzato su disco contenente il codice eseguibile, memorizzato su disco Assembler, Linker & Loader 5 Esempio Esempio . gl obl mai n mai n: . . . j al pr oc . . . . gl obl pr oc pr oc: addi $sp, $sp, - 20 . . . beq $s0, $zer o, r et addi $a0, $s0, - 1 addi $a1, $s1, 0 addi $a2, $s2, 0 j al pr oc addi $s3, $v0, 0 addi $a0, $s0, 0 addi $a1, $s1, 0 addi $a2, $s2, 0 j al i s_i n beq $v0, $zer o, el se2 sl l $s3, $s3, 1 addi $s3, $s3, 1 j r et el se2: addi $s3, $s3, 2 r et : addi $v0, $s3, 0 . . . addi $sp, $sp, 20 j r $r a . gl obl i s_i n i s_i n: addi $t 0, $zer o, 0 addi $t 1, $zer o, 0 whi l e: sl t $t 2, $t 0, $a2 beq $t 2, $zer o, end sl l $t 3, $t 0, 2 add $t 3, $a1, $t 3 l w $t 4, 0( $t 3) bne $t 4, $a0, i nc addi $t 1, $zer o, 1 j end i nc: addi $t 0, $t 0, 1 j whi l e end: addi $v0, $t 1, 0 j r $r a Assembler, Linker & Loader 6 L L assemblatore assemblatore Traduce un modulo in assembler in un file oggetto Traduce un modulo in assembler in un file oggetto Una combinazione di Una combinazione di Istruzioni in linguaggio macchina Istruzioni in linguaggio macchina Dati Dati Informazioni per la corretta collocazione del modulo in memoria: Informazioni per la corretta collocazione del modulo in memoria: Rilocazione Rilocazione Esempio Esempio Per poter tradurre in linguaggio macchina le istruzioni di salto Per poter tradurre in linguaggio macchina le istruzioni di salto, , l l assemblatore deve poter determinare gli indirizzi corrispondenti assemblatore deve poter determinare gli indirizzi corrispondenti alle alle etichette usate nei salti ( etichette usate nei salti (tabella dei simboli tabella dei simboli) ) Tabella dei simboli Tabella dei simboli: contiene le corrispondenze tra nomi delle : contiene le corrispondenze tra nomi delle etichette (simboli) ed indirizzi di memoria etichette (simboli) ed indirizzi di memoria Il file oggetto prodotto dall Il file oggetto prodotto dall assemblatore assume che il assemblatore assume che il modulo parta dalla locazione di memoria 0 (indirizzi relativi) modulo parta dalla locazione di memoria 0 (indirizzi relativi) Sar Sar il il linker linker a gestire la a gestire la rilocazione rilocazione Istruzioni dipendenti da un indirizzo assoluto Istruzioni dipendenti da un indirizzo assoluto Assembler, Linker & Loader 7 Il processo di assemblaggio Il processo di assemblaggio Il processo di traduzione in linguaggio macchina Il processo di traduzione in linguaggio macchina semplice, semplice, salvo per le istruzioni con riferimenti a etichette locali non salvo per le istruzioni con riferimenti a etichette locali non ancora dichiarate ( ancora dichiarate (riferimenti in avanti riferimenti in avanti: l : l etichetta etichetta usata usata prima di essere definita) prima di essere definita) Assemblatore a due passate Assemblatore a due passate Prima passata Prima passata: calcola la lunghezza delle istruzioni e genera una : calcola la lunghezza delle istruzioni e genera una tabella dei simboli, contenente l tabella dei simboli, contenente l associazione tra i nomi delle associazione tra i nomi delle etichette ed i corrispondenti indirizzi di memoria etichette ed i corrispondenti indirizzi di memoria Seconda passata Seconda passata: tutti i riferimenti locali sono noti: usando la : tutti i riferimenti locali sono noti: usando la tabella dei simboli, pu generare il codice macchina tabella dei simboli, pu generare il codice macchina Assemblatore ad una passata Assemblatore ad una passata Traduce in codice binario tutte le istruzioni tranne quelle con Traduce in codice binario tutte le istruzioni tranne quelle con riferimenti in avanti (tecnica del riferimenti in avanti (tecnica del backpatching backpatching) ) Mette queste istruzioni in una tabella dei simboli irrisolti Mette queste istruzioni in una tabella dei simboli irrisolti Alla fine traduce anche queste Alla fine traduce anche queste Maggiore velocit Maggiore velocit ma intera rappresentazione binaria in memoria ma intera rappresentazione binaria in memoria Assembler, Linker & Loader 8 Struttura del file oggetto Struttura del file oggetto Nei sistemi Nei sistemi Unix Unix, il file oggetto , il file oggetto composto da 6 sezioni distinte composto da 6 sezioni distinte Object Object file file header header (intestazione) (intestazione) Dimensione e posizione delle altre parti del file oggetto Dimensione e posizione delle altre parti del file oggetto Segmento di testo Segmento di testo Codice in linguaggio macchina per le procedure nel file sorgente Codice in linguaggio macchina per le procedure nel file sorgente; ; possono esserci riferimenti irrisolti (istruzioni contenenti rif possono esserci riferimenti irrisolti (istruzioni contenenti riferimenti a erimenti a simboli esterni) simboli esterni) Segmento di dati Segmento di dati Rappresentazione binaria dei dati Rappresentazione binaria dei dati Informazioni di Informazioni di rilocazione rilocazione Identificazione di istruzioni e dati da aggiornare al momento de Identificazione di istruzioni e dati da aggiornare al momento della lla rilocazione rilocazione, in quanto dipendenti da indirizzi di memoria assoluti , in quanto dipendenti da indirizzi di memoria assoluti Tabella dei simboli Tabella dei simboli Simboli definiti nel modulo e Simboli definiti nel modulo e riferibili dall riferibili dall esterno esterno (etichette globali) e (etichette globali) e lista dei lista dei riferimenti irrisolti riferimenti irrisolti (ad es. per uso di funzioni di libreria) (ad es. per uso di funzioni di libreria) Informazioni per il Informazioni per il debugger debugger Descrizione concisa del modo in cui il programma Descrizione concisa del modo in cui il programma stato compilato stato compilato Assembler, Linker & Loader 9 Esempio: Primo Passata Esempio: Primo Passata Etichetta Etichetta Indirizzo Indirizzo proc proc 0x00 0x00 else2 else2 0x60 0x60 ret ret 0x64 0x64 . gl obl pr oc pr oc: addi $sp, $sp, - 20 . . . beq $s0, $zer o, r et addi $a0, $s0, - 1 addi $a1, $s1, 0 addi $a2, $s2, 0 j al pr oc addi $s3, $v0, 0 addi $a0, $s0, 0 addi $a1, $s1, 0 addi $a2, $s2, 0 j al i s_i n beq $v0, $zer o, el se2 sl l $s3, $s3, 1 addi $s3, $s3, 1 j r et el se2: addi $s3, $s3, 2 r et : addi $v0, $s3, 0 . . . addi $sp, $sp, 20 j r $r a Tabella dei Simboli Assembler, Linker & Loader 10 Esempio: Secondo Passata Esempio: Secondo Passata . gl obl pr oc pr oc: addi $sp, $sp, - 20 . . . beq $s0, $zer o, r et addi $a0, $s0, - 1 addi $a1, $s1, 0 addi $a2, $s2, 0 j al pr oc addi $s3, $v0, 0 addi $a0, $s0, 0 addi $a1, $s1, 0 addi $a2, $s2, 0 j al i s_i n beq $v0, $zer o, el se2 sl l $s3, $s3, 1 addi $s3, $s3, 1 j r et el se2: addi $s3, $s3, 2 r et : addi $v0, $s3, 0 . . . addi $sp, $sp, 20 j r $r a addi $sp, $sp, - 20 . . . beq $s0, $zer o, 14 addi $a0, $s0, - 1 addi $a1, $s1, 0 addi $a2, $s2, 0 j al 0x0 addi $s3, $v0, 0 addi $a0, $s0, 0 addi $a1, $s1, 0 addi $a2, $s2, 0 j al ??? beq $v0, $zer o, 3 sl l $s3, $s3, 1 addi $s3, $s3, 1 j 0x64 addi $s3, $s3, 2 addi $v0, $s3, 0 . . . addi $sp, $sp, 20 j r $r a Generazione Codice Macchina Etichetta Etichetta Indirizzo Indirizzo proc proc 0x00 0x00 else2 else2 0x60 0x60 ret ret 0x64 0x64 Tabella dei Simboli Etichetta Etichetta Indirizzo Indirizzo proc proc 0x00 0x00 is_in is_in 0x4B 0x4B Tabella dei Simboli Istr Istr. . Indirizzo Indirizzo jal jal 0x38 0x38 jal jal 0x4B 0x4B j j 0x5B 0x5B Relocation Information Assembler, Linker & Loader 11 Il Il linker linker Ciascun modulo ha il suo spazio degli indirizzi Ciascun modulo ha il suo spazio degli indirizzi Quando i moduli vengono collegati occorre Quando i moduli vengono collegati occorre traslare traslare i loro spazi degli i loro spazi degli indirizzi indirizzi Occorre risolvere tutti i riferimenti esterni Occorre risolvere tutti i riferimenti esterni tramite etichette tramite etichette globali globali - - ossia le chiamate tra moduli e riferimenti a variabili ossia le chiamate tra moduli e riferimenti a variabili globali globali Compiti del Compiti del linker linker (a partire dalla tabella dei simboli e dalle (a partire dalla tabella dei simboli e dalle informazioni di informazioni di rilocazione rilocazione) ) Porre simbolicamente in memoria istruzioni e dati Porre simbolicamente in memoria istruzioni e dati Determinare gli indirizzi dei dati e delle etichette dei salti Determinare gli indirizzi dei dati e delle etichette dei salti Unire i riferimenti interni ed esterni alle procedure Unire i riferimenti interni ed esterni alle procedure Il Il linker linker produce un file oggetto che pu essere eseguito sulla produce un file oggetto che pu essere eseguito sulla macchina macchina Stesso formato del file oggetto ma con tutti i riferimenti risol Stesso formato del file oggetto ma con tutti i riferimenti risolti e ti e senza informazioni di senza informazioni di rilocazione rilocazione Assembler, Linker & Loader 12 Esempio Esempio . . . j al ??? . . . addi $t 0, $zer o, 0 addi $t 1, $zer o, 0 sl t $t 2, $t 0, $a2 beq $t 2, $zer o, 8 sl l $t 3, $t 0, 2 add $t 3, $a1, $t 3 l w $t 4, 0( $t 3) bne $t 4, $a0, 2 addi $t 1, $zer o, 1 j 0x30 addi $t 0, $t 0, 1 j 0x08 addi $v0, $t 1, 0 j r $r a addi $sp, $sp, - 20 . . . beq $s0, $zer o, 14 addi $a0, $s0, - 1 addi $a1, $s1, 0 addi $a2, $s2, 0 j al 0x00 addi $s3, $v0, 0 addi $a0, $s0, 0 addi $a1, $s1, 0 addi $a2, $s2, 0 j al ??? beq $v0, $zer o, 3 sl l $s3, $s3, 1 addi $s3, $s3, 1 j 0x64 addi $s3, $s3, 2 addi $v0, $s3, 0 . . . addi $sp, $sp, 20 j r $r a 0x400000 0x4000AC 0x4000B0 0x400120 0x400124 0x400158 Assembler, Linker & Loader 13 Esempio Esempio . . . j al 0x4000B0 . . . addi $t 0, $zer o, 0 addi $t 1, $zer o, 0 sl t $t 2, $t 0, $a2 beq $t 2, $zer o, 8 sl l $t 3, $t 0, 2 add $t 3, $a1, $t 3 l w $t 4, 0( $t 3) bne $t 4, $a0, 2 addi $t 1, $zer o, 1 j 0x400154 addi $t 0, $t 0, 1 j 0x40012B addi $v0, $t 1, 0 j r $r a addi $sp, $sp, - 20 . . . beq $s0, $zer o, 14 addi $a0, $s0, - 1 addi $a1, $s1, 0 addi $a2, $s2, 0 j al 0x4000B0 addi $s3, $v0, 0 addi $a0, $s0, 0 addi $a1, $s1, 0 addi $a2, $s2, 0 j al 0x400124 beq $v0, $zer o, 3 sl l $s3, $s3, 1 addi $s3, $s3, 1 j 0x400104 addi $s3, $s3, 2 addi $v0, $s3, 0 . . . addi $sp, $sp, 20 j r $r a 0x400000 0x4000AC 0x4000B0 0x400120 0x400124 0x400158 Assembler, Linker & Loader 14 Istruzioni MIPS da Istruzioni MIPS da Rilocare Rilocare Indirizzi relativi al PC (istruzioni Indirizzi relativi al PC (istruzioni beq beq e e bne bne): da ): da non non rilocare rilocare L L indirizzamento relativo al PC indirizzamento relativo al PC preservato anche se il preservato anche se il codice viene spostato codice viene spostato Indirizzi assoluti (istruzioni j e Indirizzi assoluti (istruzioni j e jal jal): da ): da rilocare rilocare sempre sempre Da Da rilocare rilocare anche istruzioni anche istruzioni lw lw e e sw sw che utilizzano che utilizzano il registro il registro $gp $gp per indirizzare dati statici per indirizzare dati statici Riferimenti esterni (tipicamente istruzione Riferimenti esterni (tipicamente istruzione jal jal): da ): da rilocare rilocare sempre sempre Assembler, Linker & Loader 15 Il Il loader loader Una volta che il Una volta che il linker linker ha creato il file eseguibile, ha creato il file eseguibile, esso viene di solito memorizzato su disco esso viene di solito memorizzato su disco All All atto dell atto dell esecuzione, il S.O. lo carica dal disco e esecuzione, il S.O. lo carica dal disco e ne avvia l ne avvia l esecuzione esecuzione Il Il loader loader si occupa di far partire il programma si occupa di far partire il programma Legge l Legge l intestazione per determinare la dimensione dei intestazione per determinare la dimensione dei segmenti testo e dati segmenti testo e dati Crea uno spazio di memoria sufficiente per testo e dati Crea uno spazio di memoria sufficiente per testo e dati Copia istruzioni e dati in memoria Copia istruzioni e dati in memoria Copia nello Copia nello stack stack i parametri (se presenti) passati al i parametri (se presenti) passati al main main Inizializza Inizializza i registri e lo i registri e lo stack stack pointer pointer Salta ad una procedura di Salta ad una procedura di inizializzazione inizializzazione che copia i che copia i parametri nei registri appositi dallo parametri nei registri appositi dallo stack stack e poi invoca la e poi invoca la procedura di inizio del programma ( procedura di inizio del programma (main main() in C) () in C) Assembler, Linker & Loader 16 Librerie collegate dinamicamente Librerie collegate dinamicamente Svantaggi del collegamento statico (prima Svantaggi del collegamento statico (prima dell dell esecuzione del programma) esecuzione del programma) Le routine della libreria fanno parte del codice eseguibile Le routine della libreria fanno parte del codice eseguibile Uso di vecchie versioni della libreria anche se disponibili Uso di vecchie versioni della libreria anche se disponibili nuove versioni nuove versioni Caricamento dell Caricamento dell intera libreria anche se usata intera libreria anche se usata parzialmente parzialmente Librerie collegate dinamicamente (DLL) Librerie collegate dinamicamente (DLL) Le routine della libreria non sono collegate e caricate Le routine della libreria non sono collegate e caricate finch finch il programma non viene eseguito il programma non viene eseguito Ogni routine viene collegata solo dopo essere invocata Ogni routine viene collegata solo dopo essere invocata ( (lazy lazy procedure procedure linkage linkage) )