ΜΥΥ- 402 Αρχιτεκτονική Υπολογιστών Μεταγλώτιση, σύνδεση Αρης Ευθυμίου
Ανακοινώσεις! Βαθμοί: 1ης εργαστηριακής άσκησης Βαθμός 0 χωρίς σχόλια δεν έχω πάρει την άσκηση! ελέγξτε μήπως δεν το στέλνετε στο σωστό αποθετήριο 0.5 για έλειψη σχολίων. 1 για λάθος (copy&paste) σχόλια! τα σχόλια είναι πολύ σημαντικά στην assembly 2 για ψευτοεντολές όπως: lw $v0, matric! Η 2η εργαστηριακή άσκηση διορθώνεται Πολλές περιπτώσεις αντιγραφής (70) Χρησιμοποιώ το MOSS (Aitken, Stanford Uni.) για έλεγχο ομοιότητας κώδικα 2
MOSS report 3
Συχνά «λάθη» 1 beq $t0, $t1, exit exit: j exit exit: 4
Συχνά «λάθη» 2 loop: beq $t0, $t1, exit bne $t0, $t1, loop exit: loop: bne $t0, $t1, loop exit: 5
Συχνά «λάθη» 3 loop: beq $t0, $zero, doa back: j loop doa: j back loop: bne $t0, $zero, skip doa code here skip: j loop 6
Το σημερινό μάθημα! Addressing modes! Μεταγλώττιση και διερμηνεία! Assembler! Object files relocaxon table symbol table! Linker staxc, dynamic linking! Loader 7
Addressing modes 1/3! Τρόποι αναφοράς σε δεδομένα (ή εντολές) μέρος της ISA ενός επεξεργαστή! Ο MIPS έχει 5 τρόπους άμμεσα (immediate) με καταχωρητή (register) αναφορά μετατόπισης/βάσης (base/displacement) αναφορά σε σχέση με τον PC (PC relaxve) απευθείας ή απόλυτη (pseudo- direct / absolute) 8
Addressing modes 2/3 9
Addressing modes 3/3 10
Εκτέλεση προγραμμάτων! Προγράμματα σε γλώσσα υψηλού επιπέδου! Δύο τρόποι εκτέλεσης: διερμηνεία, μετάφραση και εκτ.! Διερμηνέας (interpreter) ένα πρόγραμμα που εκτελεί προγράμματα! Μεταφραστής (compiler) ένα πρόγραμμα που μεταφράζει προγράμματα σε γλώσσα assembly (και τελικά γλώσσα μηχανής) 11
Διερμηνεία! Χρησιμοποιείται για γλώσσες πολύ υψηλού επιπέδου haskel, scheme,! Παρέχει ευκολίες π.χ. δεν χρειάζεται δήλωση μεταβλητών, ο τύπος μιας μεταβλητής αλλάζει,... τρέχει σε οποιοδήποτε υπολογιστή! Γενικά η εκτέλεση είναι αργή τάξης 10x πιο αργή από αντίστοιχο πρόγραμμα σε γλώσσα μηχανής! Δύσκολο να κρυφτεί ο πηγαίος κώδικας 12
Διερμηνεία κώδικα μηχανής! Εύκολη γιατί η γλώσσα είναι απλή! Σε τι είναι χρήσιμο;! Προσομοίωση (simulaxon) π.χ. ο Mars περιέχει ένα διερμηνέα γλώσσας μηχανής MIPS! Emulaxon π.χ. όταν οι Mac αλλαξαν από PowerPC σε x86 επεξεργαστές Τα παλιά προγράμματα «προσομοιώνονταν» στον καινούριο επεξεργαστή Χρησιμοποιείται και για πολύπλοκες σπάνιες εντολές που δεν είναι υλοποιημένες σε hardware 13
Μεταφραση- εκτέλεση C 14
Assembler! Μεταφράζει από assembly (με ψευτοεντολές, macros) σε κώδικα μηχανής! macros - inline υπορουτίνες αντί για κλήση και επιστροφή (jal, jr) αντιγράφεται ο κώδικας αλλά υπάρχει παραμετροποίηση! Το αποτέλεσμα λέγεται object file για προγράμματα χωρισμένα σε πολλά αρχεία περιέχει τον κώδικα μηχανής και διάφορους πίνακες με πληροφορίες! περισσότερα σε λίγο 15
Assembler! Αριθμητικές (και παρόμοιες) εντολές δεν χρειάζεται τίποτα: όλη η πληροφορία είναι ήδη στην εντολή! Διακλαδόσεις διευθύνσεις «σχετικές» με τον PC (PC- relaxve) μετά την αντικατάσταση ψευτοεντολών, εύκολα υπολογίζεται πόσες εντολές μακρυά είναι μια ετικέτα προορισμός διακλάδοσης! Διπλό πέρασμα για μελλοντικές αναφορές beq $t1, $zero, skip skip: forward reference 16
Απόλυτες διευθύνσεις! Οι εντολές j, jal χρειάζονται την τελική διεύθυνση του στόχου/υπορουτίνας (absolute address)! Παρόμοια για διευθύνσεις στατικών δεδομένων! Για προγράμματα σε πολλά αρχεία/βιβλιοθήκες, οι τελικές διευθύνσεις δεν είναι γνωστές στον assembler! Θα γίνουν γνωστές κατά τη σύνδεση (link) όλα τα δεδομένα και ο κώδικας τοποθετούνται μαζί! Για την ώρα ο assembler μαζεύει σε πίνακες τις πληροφορίες που θα χρειαστεί ο linker 17
Πίνακας συμβόλων! Αγγλικός όρος: Symbol table! Πίνακας με όλα τα στοιχεία του αρχείου που θα είναι χρήσιμα σε κώδικα που βρίσκεται σε άλλα αρχεία θυμηθείτε την οδηγία.global! Στοιχεία: ετικέτες (αρχής) υπορουτινών ετικέτες δεδομένων 18
Πίνακας μετατόπισης! Αγγλικός όρος: relocaxon table! Πίνακας με τις διευθύνσεις όλων των εντολών που χρειάζονται «διόρθωση» στη διεύθυνση (σταθερά) που έχουν j, jal! για «τοπικές» και για απομακρυσμένες διευθύνσεις- στόχους μεταφορές από/προς στατική μνήμη: εντολές τύπου la! ή lw καταχωρητής σταθερά ($gp) 19
Παράδειγμα filea.asm:.data arraya1:.word 0:16.text proca1: jal proca2 la $t0, arraya1 proca2: loop: beq $s0, $s1, next jal procb1 next: j loop fileβ.asm: symbol table.text procβ1: loop: beq $s0, $s1, next la $t0, arraya1 next: j loop relocaxon table 20
Αρχείο object! object file header (επικεφαλίδα): πληροφορίες για το μέγεθος και τη θέση των υπόλοιπων πεδίων! text segment: κώδικας μηχανής! data segment: τα στατικά δεδομένα του αρχείου! relocaxon informaxon: ποιές εντολές πρέπει να αλλαχθούν αργότερα! symbol table: ετικέτες που αναφέρονται από εντολές (συνήθως άλλων αρχείων object του προγράμματος)! debugging informaxon! Το τελικό εκτελέσιμο είναι επίσης object file 21
Object file! Σε unix η πιο συνηθισμένη μορφή είναι ELF! και η κατάληξη αρχείου.o! Υπάρχουν εργαλεία για να παρατηρήσουμε τέτοια αρχεία readelf, objdump! Δοκιμάστε το σε κάποιο μικρό εκτελέσιμο αρχείο στο Unix βέβαια ο κώδικας θα είναι x86 assembly 22
Linker! Συνδιάζει πολλαπλά αρχεία object σε ένα εκτελέσιμο είσοδος: αρχεία.o, οδηγίες έξοδος: εκτελέσιμο αρχείο. a.out αν δεν του δώσουμε όνομα! Βοηθάει ώστε να «σπάει» ο πηγαίος κώδικας σε πολλαπλά αρχεία ο κώδικας εφαρμογών είναι τεράστιος! ξεχωριστή μετάφραση για κάθε αρχείο πηγαίου κώδικα! αλλιώς κάθε αλλαγή θα έπερνε πολλή ώρα για μετάφραση μόνο! Αναφέρεται και ώς link editor διορθώνει τις «συνδέσεις» προγραμμάτων. π.χ. jump- and- link 23
Linker: σύνδεση.o file 1 text 1 data 1 info 1.o file 2 text 2 data 2 info 2 a.out Relocated text 1 Linker Relocated text 2 Relocated data 1 Relocated data 2
Ξεκαθάρισμα αναφορών! Αγγλικός όρος: resolve references! Ο linker γνωριζει πόσο χώρο χρειάζεται κάθε τμήμα, κάθε αρχείου σε ποιές εντολές χρειάζεται να κάνει αλλαγές (relocaxon tables)! Ο linker υπολογίζει την ακριβή διεύθυνση κάθε ετικέτας (symbol tables)! Ο linker αλλάζει τις σταθερές σε όλες τις εντολές που έχουν απόλυτες διευθύνσεις 25
Βιβλιοθήκες! Εκτός από τα αρχεία object του προγραμματιστή, υπάρχουν και αντίστοιχα αρχεία βιβλιοθήκης π.χ. χειρισμός αρχείων, εμφάνιση μηνυμάτων στην οθόνη,...! Στο unix είναι σε μορφή elf και η κατάληξη είναι.a σε λίγο θα δούμε και.so! Αναφορές από τα object αρχεία του προγράμματος αναζητούνται σε αρχεία object βιβλιοθήκης χρειάζεται να πούμε στον linker ποιές βιβλιοθήκες χρειάζονται! Ο κώδικας και τα στατικά δεδομένα (σπάνια) βιβλιοθήκης συνδέονται με τον κώδικα του προγράμματος στατική σύνδεση (staxc linking) 26
Στατική σύνδεση! Η βιβλιοθήκη (ολόκληρη) γίνεται μέρος του εκτελέσιμου ακόμα και οι υπορουτίνες που δεν χρησιμοποιούνται! Το εκτελέσιμο είναι πολύ μεγάλο! Αλλαγές στη βιβλιοθήκη δεν μπορούν να περάσουν στο εκτελέσιμο! Αλλά, το εκτελέσιμο είναι «αυτόνομο»! Εναλλακτική επιλογή: δυναμικά συνδεδεμένες βιβλιοθήκες (dynamically linked libraries - DLLs) πλεον η συνηθισμένη μορφή 27
Δυναμικά συνδεδεμένες βιβλιοθήκες! Πλεονεκτήματα λιγότερος χώρος στο δίσκο για την εφαρμογή λιγότερος χρόνος για download εκτέλεση προγραμμάτων που μοιράζονται βιβλιοθήκες χρειάζεται λιγότερο χώρο στη μνήμη! ο κώδικας της βιβλιοθήκης είναι κοινός εκμετάλευση νέων εκδόσεων της βιβλιοθήκης! Μειωνεκτήματα κάπως ποιο αργή η κλήση υπορουτινών η εφαρμογή δεν είναι αυτόνομη: δεν αρκεί μόνο το εκτελέσιμο 28
Lazy linking 29
Loader! Φορτώνει και εκτελεί το πρόγραμμα προγραμμα: αρχείο τύπου object (ELF) αποθηκευμένο στο δίσκο! Πρέπει να διαβαστεί από το δίσκο και ο Program Counter να αλλάξει ώστε να δείχνει στην πρώτη εντολή του προγράμματος! Μέρος του λειτουργικού συστήματος 30
Loader, λεπτομέρειες! Διαβάζει την επικεφαλίδα του αρχείου βρίσκει το μέγεθος του κώδικα και στατικών δεδομένων! Παίρνει/βρίσκει χώρο στη μνήμη για τον κώδικα, δεδομένα και τη στοίβα σε άλλο μάθημα: εικονική μνήμη,...! Αντιγράφει κώδικα και δεδομένα από το δίσκο στη μνήμη! Αντιγράφει ορίσματα του προγράμματος στη στοίβα όπως σε κλήση υπορουτίνας! Αρχικοποιεί τους καταχωρητές Συνήθως τους μηδενίζει, αλλά θυμηθείτε «ειδικούς» καταχωρητές: stack pointer, global pointer,! Ξεκινάει ρουτίνα start- up αντιγράφει ορίσματα σε καταχωρητές και καλεί την main με jal Αν η main επιστρέψει, καλεί το exit system call
Επόμενο μάθημα Πώς μοιάζει η γλώσσα άλλων μηχανών: assembly ARM, x86 32