Προσομοιωτές συστημάτων υπολογιστών: ο γνωστός προσομοιωτής πλήρους πλατφόρμας και η άγνωστη γραμμή και ίχνος

Στο δεύτερο μέρος του άρθρου σχετικά με τους προσομοιωτές συστημάτων υπολογιστών, θα συνεχίσω να μιλάω σε μια απλή εισαγωγική μορφή για τους προσομοιωτές υπολογιστών, συγκεκριμένα για την προσομοίωση πλήρους πλατφόρμας, την οποία συναντά συχνότερα ο μέσος χρήστης, καθώς και για το ρολόι -μοντέλο ρολογιού και ίχνη, που είναι πιο συνηθισμένα στους κύκλους προγραμματιστών.

Προσομοιωτές συστημάτων υπολογιστών: ο γνωστός προσομοιωτής πλήρους πλατφόρμας και η άγνωστη γραμμή και ίχνος

В το πρώτο μέρος Μίλησα για το τι είναι γενικά οι προσομοιωτές, καθώς και για τα επίπεδα προσομοίωσης. Τώρα, με βάση αυτή τη γνώση, προτείνω να βουτήξουμε λίγο βαθύτερα και να μιλήσουμε για προσομοίωση πλήρους πλατφόρμας, πώς να συλλέγουμε ίχνη, τι να τα κάνουμε αργότερα, καθώς και για μικροαρχιτεκτονική εξομοίωση ρολόι προς ρολόι.

Προσομοιωτής πλήρους πλατφόρμας ή "Μόνος στο πεδίο δεν είναι πολεμιστής"

Εάν θέλετε να μελετήσετε τη λειτουργία μιας συγκεκριμένης συσκευής, για παράδειγμα, μιας κάρτας δικτύου ή να γράψετε υλικολογισμικό ή πρόγραμμα οδήγησης για αυτήν τη συσκευή, τότε μια τέτοια συσκευή μπορεί να προσομοιωθεί ξεχωριστά. Ωστόσο, η χρήση του μεμονωμένα από την υπόλοιπη υποδομή δεν είναι πολύ βολική. Για να τρέξετε το αντίστοιχο πρόγραμμα οδήγησης, θα χρειαστείτε κεντρικό επεξεργαστή, μνήμη, πρόσβαση σε δίαυλο δεδομένων κ.λπ. Επιπλέον, το πρόγραμμα οδήγησης απαιτεί ένα λειτουργικό σύστημα (OS) και μια στοίβα δικτύου για να λειτουργήσει. Επιπλέον, ενδέχεται να απαιτείται ξεχωριστή γεννήτρια πακέτων και διακομιστής απόκρισης.

Ένας προσομοιωτής πλήρους πλατφόρμας δημιουργεί ένα περιβάλλον για την εκτέλεση μιας πλήρους στοίβας λογισμικού, η οποία περιλαμβάνει τα πάντα, από το BIOS και το bootloader μέχρι το ίδιο το λειτουργικό σύστημα και τα διάφορα υποσυστήματα του, όπως η ίδια στοίβα δικτύου, προγράμματα οδήγησης και εφαρμογές σε επίπεδο χρήστη. Για να γίνει αυτό, υλοποιεί μοντέλα λογισμικού των περισσότερων συσκευών υπολογιστών: επεξεργαστή και μνήμη, δίσκο, συσκευές εισόδου/εξόδου (πληκτρολόγιο, ποντίκι, οθόνη), καθώς και την ίδια κάρτα δικτύου.

Παρακάτω είναι ένα μπλοκ διάγραμμα του chipset x58 από την Intel. Ένας προσομοιωτής υπολογιστή πλήρους πλατφόρμας σε αυτό το chipset απαιτεί την υλοποίηση των περισσότερων από τις αναφερόμενες συσκευές, συμπεριλαμβανομένων εκείνων που βρίσκονται μέσα στο IOH (Input/Output Hub) και ICH ​​(Input/Output Controller Hub), οι οποίες δεν απεικονίζονται λεπτομερώς στο μπλοκ διάγραμμα . Αν και, όπως δείχνει η πρακτική, δεν υπάρχουν πολλές συσκευές που δεν χρησιμοποιούνται από το λογισμικό που πρόκειται να τρέξουμε. Δεν χρειάζεται να δημιουργηθούν μοντέλα τέτοιων συσκευών.

Προσομοιωτές συστημάτων υπολογιστών: ο γνωστός προσομοιωτής πλήρους πλατφόρμας και η άγνωστη γραμμή και ίχνος

Τις περισσότερες φορές, οι προσομοιωτές πλήρους πλατφόρμας υλοποιούνται σε επίπεδο εντολών επεξεργαστή (ISA, βλέπε παρακάτω). προηγούμενο άρθρο). Αυτό σας επιτρέπει να δημιουργήσετε τον ίδιο τον προσομοιωτή σχετικά γρήγορα και οικονομικά. Το επίπεδο ISA είναι επίσης καλό επειδή παραμένει λίγο-πολύ σταθερό, σε αντίθεση, για παράδειγμα, με το επίπεδο API/ABI, το οποίο αλλάζει πιο συχνά. Επιπλέον, η υλοποίηση σε επίπεδο εντολών σάς επιτρέπει να εκτελέσετε το λεγόμενο μη τροποποιημένο δυαδικό λογισμικό, δηλαδή να εκτελέσετε ήδη μεταγλωττισμένο κώδικα χωρίς αλλαγές, ακριβώς όπως χρησιμοποιείται σε πραγματικό υλικό. Με άλλα λόγια, μπορείτε να δημιουργήσετε ένα αντίγραφο ("dump") του σκληρού σας δίσκου, να το καθορίσετε ως εικόνα για ένα μοντέλο σε έναν προσομοιωτή πλήρους πλατφόρμας και voila! – Το λειτουργικό σύστημα και άλλα προγράμματα φορτώνονται στον προσομοιωτή χωρίς πρόσθετες ενέργειες.

Απόδοση προσομοιωτή

Προσομοιωτές συστημάτων υπολογιστών: ο γνωστός προσομοιωτής πλήρους πλατφόρμας και η άγνωστη γραμμή και ίχνος

Όπως αναφέρθηκε ακριβώς παραπάνω, η διαδικασία προσομοίωσης ολόκληρου του συστήματος, δηλαδή όλων των συσκευών του, είναι ένα αρκετά αργό εγχείρημα. Εάν τα εφαρμόσετε όλα αυτά σε πολύ λεπτομερές επίπεδο, για παράδειγμα, μικροαρχιτεκτονικό ή λογικό, τότε η εκτέλεση θα γίνει εξαιρετικά αργή. Αλλά το επίπεδο εντολών είναι μια κατάλληλη επιλογή και επιτρέπει στο λειτουργικό σύστημα και τα προγράμματα να εκτελούνται σε ταχύτητες που είναι επαρκείς ώστε ο χρήστης να αλληλεπιδρά άνετα μαζί τους.

Εδώ θα ήταν σκόπιμο να θίξουμε το θέμα της απόδοσης του προσομοιωτή. Συνήθως μετριέται σε IPS (εντολές ανά δευτερόλεπτο), πιο συγκεκριμένα σε MIPS (εκατομμύρια IPS), δηλαδή στον αριθμό των εντολών του επεξεργαστή που εκτελούνται από τον προσομοιωτή σε ένα δευτερόλεπτο. Ταυτόχρονα, η ταχύτητα της προσομοίωσης εξαρτάται επίσης από την απόδοση του συστήματος στο οποίο εκτελείται η ίδια η προσομοίωση. Επομένως, μπορεί να είναι πιο σωστό να μιλάμε για «επιβράδυνση» του προσομοιωτή σε σύγκριση με το αρχικό σύστημα.

Οι πιο συνηθισμένοι προσομοιωτές πλήρους πλατφόρμας στην αγορά, όπως οι QEMU, VirtualBox ή VmWare Workstation, έχουν καλή απόδοση. Μπορεί να μην είναι καν αντιληπτό στον χρήστη ότι η εργασία συνεχίζεται στον προσομοιωτή. Αυτό συμβαίνει χάρη στις ειδικές δυνατότητες εικονικοποίησης που εφαρμόζονται σε επεξεργαστές, αλγόριθμους δυαδικής μετάφρασης και άλλα ενδιαφέροντα πράγματα. Όλα αυτά είναι ένα θέμα για ένα ξεχωριστό άρθρο, αλλά εν συντομία, η εικονικοποίηση είναι ένα χαρακτηριστικό υλικού των σύγχρονων επεξεργαστών που επιτρέπει στους προσομοιωτές να μην προσομοιώνουν οδηγίες, αλλά να τις στέλνουν για εκτέλεση απευθείας σε έναν πραγματικό επεξεργαστή, εάν, φυσικά, οι αρχιτεκτονικές του ο προσομοιωτής και ο επεξεργαστής είναι παρόμοιοι. Η δυαδική μετάφραση είναι η μετάφραση του κώδικα επισκέπτη μηχανής σε κώδικα κεντρικού υπολογιστή και η επακόλουθη εκτέλεση σε έναν πραγματικό επεξεργαστή. Ως αποτέλεσμα, η προσομοίωση είναι ελαφρώς πιο αργή, 5-10 φορές, και συχνά εκτελείται με την ίδια ταχύτητα με το πραγματικό σύστημα. Αν και αυτό επηρεάζεται από πολλούς παράγοντες. Για παράδειγμα, αν θέλουμε να προσομοιώσουμε ένα σύστημα με πολλές δεκάδες επεξεργαστές, τότε η ταχύτητα θα πέσει αμέσως κατά πολλές δεκάδες φορές. Από την άλλη πλευρά, προσομοιωτές όπως το Simics στις πιο πρόσφατες εκδόσεις υποστηρίζουν υλικό κεντρικού υπολογιστή πολλαπλών επεξεργαστών και παραλληλίζουν αποτελεσματικά τους προσομοιωμένους πυρήνες στους πυρήνες ενός πραγματικού επεξεργαστή.

Αν μιλάμε για την ταχύτητα της μικροαρχιτεκτονικής προσομοίωσης, τότε είναι συνήθως αρκετές τάξεις μεγέθους, περίπου 1000-10000 φορές πιο αργή από την εκτέλεση σε έναν κανονικό υπολογιστή, χωρίς προσομοίωση. Και οι υλοποιήσεις στο επίπεδο των λογικών στοιχείων είναι πιο αργές κατά αρκετές τάξεις μεγέθους. Ως εκ τούτου, ένα FPGA χρησιμοποιείται ως εξομοιωτής σε αυτό το επίπεδο, το οποίο μπορεί να αυξήσει σημαντικά την απόδοση.

Το παρακάτω γράφημα δείχνει μια κατά προσέγγιση εξάρτηση της ταχύτητας προσομοίωσης από τις λεπτομέρειες του μοντέλου.

Προσομοιωτές συστημάτων υπολογιστών: ο γνωστός προσομοιωτής πλήρους πλατφόρμας και η άγνωστη γραμμή και ίχνος

Beat-by-beat προσομοίωση

Παρά τη χαμηλή ταχύτητα εκτέλεσής τους, οι μικροαρχιτεκτονικοί προσομοιωτές είναι αρκετά συνηθισμένοι. Η προσομοίωση των εσωτερικών μπλοκ του επεξεργαστή είναι απαραίτητη για την ακριβή προσομοίωση του χρόνου εκτέλεσης κάθε εντολής. Μπορεί να προκύψει παρεξήγηση εδώ - τελικά, φαίνεται, γιατί να μην προγραμματίσετε απλώς τον χρόνο εκτέλεσης για κάθε εντολή. Αλλά ένας τέτοιος προσομοιωτής θα είναι πολύ ανακριβής, καθώς ο χρόνος εκτέλεσης της ίδιας εντολής μπορεί να διαφέρει από κλήση σε κλήση.

Το απλούστερο παράδειγμα είναι μια εντολή πρόσβασης στη μνήμη. Εάν η ζητούμενη θέση μνήμης είναι διαθέσιμη στην κρυφή μνήμη, τότε ο χρόνος εκτέλεσης θα είναι ελάχιστος. Εάν αυτές οι πληροφορίες δεν βρίσκονται στην κρυφή μνήμη ("αποτυχία προσωρινής μνήμης"), τότε αυτό θα αυξήσει σημαντικά τον χρόνο εκτέλεσης της εντολής. Επομένως, απαιτείται ένα μοντέλο κρυφής μνήμης για ακριβή προσομοίωση. Ωστόσο, το θέμα δεν περιορίζεται στο μοντέλο της κρυφής μνήμης. Ο επεξεργαστής δεν θα περιμένει απλώς να ανακτηθούν δεδομένα από τη μνήμη όταν δεν βρίσκονται στη μνήμη cache. Αντίθετα, θα αρχίσει να εκτελεί τις επόμενες οδηγίες, επιλέγοντας εκείνες που δεν εξαρτώνται από το αποτέλεσμα της ανάγνωσης από τη μνήμη. Αυτή είναι η λεγόμενη "εκτός σειράς" εκτέλεση (OOO, εκτός σειράς εκτέλεση), απαραίτητη για την ελαχιστοποίηση του χρόνου αδράνειας του επεξεργαστή. Η μοντελοποίηση των αντίστοιχων μπλοκ επεξεργαστή θα βοηθήσει να ληφθούν όλα αυτά υπόψη κατά τον υπολογισμό του χρόνου εκτέλεσης των εντολών. Μεταξύ αυτών των οδηγιών, που εκτελούνται ενώ αναμένεται το αποτέλεσμα της ανάγνωσης από τη μνήμη, μπορεί να προκύψει μια λειτουργία άλματος υπό όρους. Εάν το αποτέλεσμα της συνθήκης είναι άγνωστο αυτή τη στιγμή, τότε και πάλι ο επεξεργαστής δεν σταματά την εκτέλεση, αλλά κάνει μια "μαντεία", εκτελεί τον κατάλληλο κλάδο και συνεχίζει να εκτελεί προληπτικά εντολές από το σημείο μετάβασης. Ένα τέτοιο μπλοκ, που ονομάζεται πρόβλεψη διακλάδωσης, πρέπει επίσης να εφαρμοστεί στον μικροαρχιτεκτονικό προσομοιωτή.

Η παρακάτω εικόνα δείχνει τα κύρια μπλοκ του επεξεργαστή, δεν είναι απαραίτητο να το γνωρίζετε, εμφανίζεται μόνο για να δείξει την πολυπλοκότητα της μικροαρχιτεκτονικής υλοποίησης.

Προσομοιωτές συστημάτων υπολογιστών: ο γνωστός προσομοιωτής πλήρους πλατφόρμας και η άγνωστη γραμμή και ίχνος

Η λειτουργία όλων αυτών των μπλοκ σε έναν πραγματικό επεξεργαστή συγχρονίζεται με ειδικά σήματα ρολογιού και το ίδιο συμβαίνει και στο μοντέλο. Ένας τέτοιος μικροαρχιτεκτονικός προσομοιωτής ονομάζεται cycle ακριβής. Ο κύριος σκοπός του είναι να προβλέψει με ακρίβεια την απόδοση του επεξεργαστή που αναπτύσσεται ή/και να υπολογίσει τον χρόνο εκτέλεσης ενός συγκεκριμένου προγράμματος, για παράδειγμα, ενός σημείου αναφοράς. Εάν οι τιμές είναι χαμηλότερες από τις απαιτούμενες, τότε θα χρειαστεί να τροποποιήσετε τους αλγόριθμους και τα μπλοκ επεξεργαστή ή να βελτιστοποιήσετε το πρόγραμμα.

Όπως φαίνεται παραπάνω, η προσομοίωση clock-by-clock είναι πολύ αργή, επομένως χρησιμοποιείται μόνο κατά τη μελέτη ορισμένων στιγμών λειτουργίας ενός προγράμματος, όπου είναι απαραίτητο να βρεθεί η πραγματική ταχύτητα εκτέλεσης του προγράμματος και να αξιολογηθεί η μελλοντική απόδοση της συσκευής της οποίας το πρωτότυπο προσομοιώνεται.

Σε αυτήν την περίπτωση, χρησιμοποιείται ένας λειτουργικός προσομοιωτής για την προσομοίωση του υπολειπόμενου χρόνου εκτέλεσης του προγράμματος. Πώς συμβαίνει αυτός ο συνδυασμός χρήσης στην πραγματικότητα; Αρχικά, εκκινείται ο λειτουργικός προσομοιωτής, στον οποίο φορτώνεται το λειτουργικό σύστημα και όλα τα απαραίτητα για την εκτέλεση του υπό μελέτη προγράμματος. Εξάλλου, δεν μας ενδιαφέρει το ίδιο το λειτουργικό σύστημα, ούτε τα αρχικά στάδια εκκίνησης του προγράμματος, η διαμόρφωσή του κ.λπ. Ωστόσο, δεν μπορούμε επίσης να παραλείψουμε αυτά τα μέρη και να προχωρήσουμε αμέσως στην εκτέλεση του προγράμματος από τη μέση. Επομένως, όλα αυτά τα προκαταρκτικά βήματα εκτελούνται σε έναν λειτουργικό προσομοιωτή. Αφού το πρόγραμμα έχει εκτελεστεί μέχρι τη στιγμή που μας ενδιαφέρει, είναι δυνατές δύο επιλογές. Μπορείτε να αντικαταστήσετε το μοντέλο με ένα μοντέλο ρολόι προς κύκλο και να συνεχίσετε την εκτέλεση. Η λειτουργία προσομοίωσης που χρησιμοποιεί εκτελέσιμο κώδικα (δηλαδή κανονικά μεταγλωττισμένα αρχεία προγράμματος) ονομάζεται προσομοίωση που βασίζεται στην εκτέλεση. Αυτή είναι η πιο κοινή επιλογή προσομοίωσης. Μια άλλη προσέγγιση είναι επίσης δυνατή - προσομοίωση που βασίζεται σε ίχνη.

Προσομοίωση βασισμένη σε ίχνη

Αποτελείται από δύο βήματα. Χρησιμοποιώντας έναν λειτουργικό προσομοιωτή ή σε ένα πραγματικό σύστημα, ένα αρχείο καταγραφής ενεργειών προγράμματος συλλέγεται και εγγράφεται σε ένα αρχείο. Αυτό το αρχείο καταγραφής ονομάζεται ίχνος. Ανάλογα με το τι εξετάζεται, το ίχνος μπορεί να περιλαμβάνει εκτελέσιμες οδηγίες, διευθύνσεις μνήμης, αριθμούς θυρών και πληροφορίες διακοπής.

Το επόμενο βήμα είναι να «παίξει» το ίχνος, όταν ο προσομοιωτής ρολογιού-προς-ρολόι διαβάζει το ίχνος και εκτελεί όλες τις οδηγίες που είναι γραμμένες σε αυτό. Στο τέλος, παίρνουμε τον χρόνο εκτέλεσης αυτού του τμήματος του προγράμματος, καθώς και διάφορα χαρακτηριστικά αυτής της διαδικασίας, για παράδειγμα, το ποσοστό των επισκέψεων στην κρυφή μνήμη.

Ένα σημαντικό χαρακτηριστικό της εργασίας με ίχνη είναι ο ντετερμινισμός, δηλαδή, εκτελώντας την προσομοίωση με τον τρόπο που περιγράφηκε παραπάνω, ξανά και ξανά αναπαράγουμε την ίδια ακολουθία ενεργειών. Αυτό καθιστά δυνατό, αλλάζοντας τις παραμέτρους του μοντέλου (μεγέθη κρυφής μνήμης, buffer και ουρά) και χρησιμοποιώντας διαφορετικούς εσωτερικούς αλγόριθμους ή ρυθμίζοντάς τους, να μελετήσουμε πώς μια συγκεκριμένη παράμετρος επηρεάζει την απόδοση του συστήματος και ποια επιλογή δίνει τα καλύτερα αποτελέσματα. Όλα αυτά μπορούν να γίνουν με ένα πρωτότυπο μοντέλο συσκευής πριν δημιουργηθεί ένα πραγματικό πρωτότυπο υλικού.

Η πολυπλοκότητα αυτής της προσέγγισης έγκειται στην ανάγκη να τρέξετε πρώτα την εφαρμογή και να συλλέξετε το ίχνος, καθώς και στο τεράστιο μέγεθος του αρχείου ανίχνευσης. Τα πλεονεκτήματα περιλαμβάνουν το γεγονός ότι αρκεί η προσομοίωση μόνο του τμήματος της συσκευής ή της πλατφόρμας που μας ενδιαφέρει, ενώ η προσομοίωση μέσω εκτέλεσης συνήθως απαιτεί ένα πλήρες μοντέλο.

Έτσι, σε αυτό το άρθρο εξετάσαμε τα χαρακτηριστικά της προσομοίωσης πλήρους πλατφόρμας, μιλήσαμε για την ταχύτητα των υλοποιήσεων σε διαφορετικά επίπεδα, την προσομοίωση ρολόι προς τον κύκλο και τα ίχνη. Σε επόμενο άρθρο θα περιγράψω τα κύρια σενάρια χρήσης προσομοιωτών, τόσο για προσωπικούς σκοπούς όσο και από πλευράς ανάπτυξης σε μεγάλες εταιρείες.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο