Η βασική ιδέα του DiffTest: Για δύο υλοποιήσεις που βασίζονται στην ίδια προδιαγραφή, με δεδομένη την ίδια καθορισμένη είσοδο, η συμπεριφορά τους θα πρέπει να είναι συνεπής. Επιστροφή στη σχεδίαση του επεξεργαστή, για τις δύο υλοποιήσεις σύμφωνα με το εγχειρίδιο riscv, δεδομένου του ίδιου σωστού προγράμματος, οι αλλαγές κατάστασής τους (μητρώα, μνήμη) θα πρέπει να είναι συνεπείς για τις δύο υλοποιήσεις:
Ένα από αυτά είναι η CPU μας.
Εναλλακτικά, επιλέξτε έναν προσομοιωτή ως υλοποίηση αναφοράς. Κάθε φορά που και τα δύο μέρη ολοκληρώνουν την εκτέλεση μιας εντολής, ελέγχουν την κατάσταση των αντίστοιχων καταχωρητών και της μνήμης τους, εάν διαπιστώσουν ότι η κατάσταση είναι ασυνεπής, αναφέρουν αμέσως ένα σφάλμα και σταματούν την εκτέλεση του προγράμματος-πελάτη (ισοδύναμο με τη διεκπεραίωση κρίσης για. κάθε οδηγία).
DiffTest = Διαδικτυακή μέθοδος επαλήθευσης συμπεριφοράς σε επίπεδο εντολών
Online = Επαλήθευση κατά την εκτέλεση του προγράμματος
Επίπεδο εντολών = κάθε εντολή που εκτελείται επαληθεύεται
Μπορεί να μετατρέψει οποιοδήποτε πρόγραμμα σε δοκιμές σε επίπεδο εντολών και να επιβεβαιώσει την κατάσταση
Υποστήριξη προγραμμάτων που δεν τελειώνουν, όπως το OS
Δεν χρειάζεται να γνωρίζετε εκ των προτέρων το αποτέλεσμα της διαδικασίας
Επειδή συγκρίνουμε τη συμπεριφορά της εκτέλεσης εντολών, όχι τη σημασιολογία του προγράμματος
Οι μεγαλύτερες χρήσεις του DiffTest είναι:Όταν παρουσιάζονται σφάλματα αποκωδικοποίησης ή εκτέλεσης μετά την εκτέλεση εκατοντάδων ή χιλιάδων εντολών, πώς βρίσκουμε γρήγορα την πρώτη εντολή σφάλματος Αυτή είναι μια δυσκολία σε επίπεδο κόλασης;
Σε αυτό το άρθρο, επιλέγουμε τα ακόλουθα ως παράδειγμα προς επεξήγηση:
Το QEMU ως αντικείμενο αναφοράς (REF)
Το NEMU ως υποκείμενο δοκιμής (DUT)
Φυσικά, εάν χρειάζεται να δοκιμάσετε το υλικό του επεξεργαστή, ο επεξεργαστής μπορεί επίσης να χρησιμοποιηθεί ως DUT.
2 DiffTest που υποστηρίζεται από το NEMU
make menuconfig
1
Εισαγάγετε Δοκιμή και εντοπισμός σφαλμάτων -> Ενεργοποίηση διαφορικής δοκιμής -> Σχεδίαση αναφοράς, ως εξής:
Όταν χρησιμοποιείται το NEMU για DUT, μπορείτε να επιλέξετε 5 λειτουργίες προσομοιωτή ως προσομοιωτή αναφοράς REF.
QEMU, λειτουργία δυναμικής βιβλιοθήκης, ο κώδικας βρίσκεται στο NEMU/tools/qemu-dl-diff/
QEMU, λειτουργία υποδοχής, ο κωδικός βρίσκεται στο NEMU/tools/qemu-socket-diff/
KVM, ο κωδικός βρίσκεται στο NEMU/tools/kvm-diff/
NEMU
ΑΚΙΔΑ
Για τα τρία τελευταία, ο συγγραφέας δεν έχει κάνει κάποια συγκεκριμένη έρευνα, επομένως αυτό το άρθρο δεν θα τα εισαγάγει.
3 Το QEMU κάνει REF (λειτουργία δυναμικής βιβλιοθήκης)
Μπορείτε να αλλάξετε το NEMU/εργαλεία/qemu-dl-diff/, μεταγλωττίστηκε στη δυναμική βιβλιοθήκη riscv64-qemu-so. Η σχέση μεταξύ NEMU, δυναμικών βιβλιοθηκών και QEMU:
Δυναμική βιβλιοθήκη: riscv64-qemu-so, η οποία εξάγει τη σειρά difftest_xx διεπαφών συναρτήσεων.
QEMU: Στο εκτελέσιμο αρχείο qemu-system-riscv64, υπάρχουν διεπαφές συναρτήσεων της σειράς cpu_xx, gdb_xx και qemu_xx.
NEMU: Το πρόγραμμα riscv64-nemu-interpreter καλεί τη δυναμική βιβλιοθήκη, η οποία στη συνέχεια καλεί το QEMU.
συγκεκριμένη διαδικασία:
Το εκτελέσιμο πρόγραμμα NEMU riscv64-nemu-interpreter φορτώνει το riscv64-qemu-so καλώντας τη συνάρτηση dlopen και αναλύει τα σύμβολα συνάρτησης της σειράς difftest_xx για επόμενες κλήσεις.
Στη συνέχεια, το NEMU καλεί τη συνάρτηση difftest_init για προετοιμασία.
Στη συνάρτηση difftest_init, η συνάρτηση dlopen θα κληθεί ξανά για να φορτώσει το εκτελέσιμο αρχείο qemu-system-riscv64 και να αναλύσει τις σειρές συμβόλων συνάρτησης cpu_xx, gdb_xx και qemu_xx Αυτά τα σύμβολα συνάρτησης είναι στην πραγματικότητα ο υποκείμενος κώδικας υλοποίησης της σειράς συναρτήσεων difftest_xx .
Από το αρχείο qemu-system-riscv64, η συνάρτηση ανάλυσης είναι η κύρια συνάρτηση και, στη συνέχεια, η συνάρτηση difftest_init θα την καλέσει για να ξεκινήσει το πρόγραμμα qemu.
Στη συνέχεια, εάν όλα είναι κανονικά, μπορείτε να καλέσετε τη συνάρτηση qemu για να συγκρίνετε τα αποτελέσματα των εντολών.
4 QEMU για REF (Λειτουργία υποδοχής)
Μπορείτε να αλλάξετε το NEMU/εργαλεία/qemu-socket-diff/, μεταγλωττίστηκε στη δυναμική βιβλιοθήκη riscv64-qemu-so. Η σχέση μεταξύ NEMU, δυναμικών βιβλιοθηκών και QEMU:
Δυναμική βιβλιοθήκη: riscv64-qemu-so, η οποία εξάγει τη σειρά difftest_xx διεπαφών συναρτήσεων.
QEMU: Το εκτελέσιμο αρχείο qemu-system-riscv64 έχει διεπαφές συναρτήσεων σειρών cpu_xx και gdb_xx.
NEMU: Το πρόγραμμα riscv64-nemu-interpreter καλεί τη δυναμική βιβλιοθήκη Η δυναμική βιβλιοθήκη στέλνει ένα πακέτο εντολών μέσω της υποδοχής και αποφασίζει ποια συνάρτηση θα καλέσει για εκτέλεση.
συγκεκριμένη διαδικασία:
Το εκτελέσιμο πρόγραμμα NEMU riscv64-nemu-interpreter φορτώνει το riscv64-qemu-so καλώντας τη συνάρτηση dlopen και αναλύει τα σύμβολα συνάρτησης της σειράς difftest_xx για επόμενες κλήσεις.
Στη συνέχεια, το NEMU καλεί τη συνάρτηση difftest_init για προετοιμασία.
Στη συνάρτηση difftest_init, μια θυγατρική διεργασία θα διαχωρίσει () και θα ξεκινήσει το QEMU καλώντας τη συνάρτηση execlp ενώ η γονική διαδικασία συνεχίζει να εκτελείται, συνδέεται στο QEMU μέσω της υποδοχής και καλεί τη συνάρτηση init_isa για προετοιμασία.
Στη συνέχεια, εάν όλα είναι κανονικά, μπορείτε να συγκρίνετε τα αποτελέσματα των εντολών μέσω της υποδοχής.