- Το IRQL ορίζει τις προτεραιότητες εκτέλεσης και καλύπτει τις διακοπές ανά επίπεδο, ενώ πάνω από το DISPATCH δίνει εντολή στο IRQL και όχι στην προτεραιότητα του νήματος.
- Ο BSOD Τα σφάλματα 0xA/0xD1 συνήθως προκαλούνται από προσβάσεις σε σελιδοποιήσιμη ή μη έγκυρη μνήμη με υψηλό IRQL και εσφαλμένες διευθύνσεις ή σελιδοποιήσιμο κώδικα.
- Τα WinDbg και το Driver Verifier είναι τα βασικά: χρησιμοποιήστε τα !analyze, !irql, ln, .trap, !pool, !address και εξετάστε τις παραμέτρους 1, 3 και 4.
- En οδηγοί, αποτρέπει σφάλματα σελίδας σε υψηλό IRQL, χρησιμοποιεί μη σελιδοποιημένη μνήμη και κλειδώματα περιστροφής. Για τον χρήστη, ενημερώνει/απομονώνει προβληματικά προγράμματα οδήγησης.
Αν έχετε δει ποτέ μπλε οθόνη με μηνύματα όπως IRQL_NOT_LESS_OR_EQUAL o DRIVER_IRQL_NOT_LESS_OR_EQUAL, πιθανότατα έχετε συναντήσει μια έννοια που είναι ελάχιστα γνωστή εκτός του κόσμου των προγραμμάτων οδήγησης: το IRQL (Interrupt Request Level). Windows, αυτό το επίπεδο προτεραιότητας διακοπής έχει προτεραιότητα έναντι της προτεραιότητας νημάτων όταν το σύστημα βρίσκεται πάνω από ένα συγκεκριμένο όριο και αυτό έχει άμεσες συνέπειες στη σταθερότητα.
Στις επόμενες γραμμές θα βρείτε ένα πλήρη οδηγό και στα ισπανικά από την Ισπανία σχετικά με το τι είναι το IRQL, πώς λειτουργεί, γιατί ενεργοποιεί τις μπλε οθόνες, πώς να διαγνώσετε το πρόβλημα με το WinDbg και τι πρέπει να κάνετε είτε είστε χρήστης που αντιμετωπίζει το σφάλμα είτε αναπτύσσετε προγράμματα οδήγησης λειτουργίας πυρήνα. Ας ξεκινήσουμε.
Τι είναι το IRQL (Επίπεδο Αιτήματος Διακοπής) στα Windows;
Στα Windows, το Το IRQL ορίζει την προτεραιότητα του υλικού στο οποίο λειτουργεί ένας επεξεργαστής σε οποιαδήποτε δεδομένη στιγμή. Στο Μοντέλο Οδηγών των Windows (WDM), ο κώδικας που εκτελείται σε χαμηλό IRQL μπορεί να διακοπεί από κώδικα που εκτελείται σε υψηλότερο IRQL. Στην πραγματικότητα, σε έναν μόνο υπολογιστή πολλαπλών πυρήνων, κάθε CPU μπορεί να βρίσκεται σε διαφορετικό IRQL, γεγονός που περιπλέκει τον συγχρονισμό.
Υπάρχει ένας βασικός κανόνας: Όταν μια CPU εκτελείται σε IRQL πάνω από το PASSIVE_LEVEL, μπορεί να προληφθεί μόνο από δραστηριότητα σε ακόμη υψηλότερο IRQL.Αυτό οργανώνει τη συνύπαρξη μεταξύ του κώδικα χρήστη, των συναρτήσεων πυρήνα, των αναβαλλόμενων καλούντων (DPC) και των ρουτινών υπηρεσίας διακοπής συσκευών (ISR).
Επίπεδα και προτεραιότητες: PASSIVE_LEVEL, APC_LEVEL, DISPATCH_LEVEL και DIRQL
Γενικά, Στο x86, χρησιμοποιούνται τιμές IRQL μεταξύ 0 και 31. στο x64, μεταξύ 0 και 15.Η πρακτική σημασία είναι η ίδια: το IRQL 0 (PASSIVE_LEVEL) είναι το σημείο όπου εκτελούνται ο κανονικός κώδικας χρήστη και πολλές συναρτήσεις του προγράμματος οδήγησης. Σφάλματα APC και σελίδας Συνήθως αντιστοιχίζονται στο IRQL 1 (APC_LEVEL). Το IRQL 2 (DISPATCH_LEVEL) περιλαμβάνει τον χρονοπρογραμματιστή νημάτων και τους DPC. Πάνω από το DISPATCH_LEVEL υπάρχουν επίπεδα που προορίζονται για διακοπές συσκευών (γνωστά ως DIRQL) και άλλες εσωτερικές χρήσεις όπως το HIGH_LEVEL.
Στο οικοσύστημα του οδηγού, Πολλές συνηθισμένες ρουτίνες εκτελούνται στο DISPATCH_LEVEL: για παράδειγμα, DPC και StartIo. Αυτός ο σχεδιασμός διασφαλίζει ότι ενώ ένα από αυτά αγγίζει εσωτερικές ουρές ή άλλους κοινόχρηστους πόρους, μια άλλη ρουτίνα στο ίδιο επίπεδο δεν την προεπιλέγει σε αυτήν την CPU, επειδή ο κανόνας προεπιλογής επιτρέπει διακοπές μόνο σε υψηλότερα επίπεδα.
Μεταξύ DISPATCH_LEVEL και των επιπέδων δημιουργίας προφίλ/υψηλών επιπέδων υπάρχει χώρος για το διακοπές υλικού κάθε συσκευής (DIRQL)Το IRQL μιας συσκευής ορίζει την προτεραιότητά της έναντι άλλων συσκευών. Ένα πρόγραμμα οδήγησης WDM λαμβάνει αυτό το IRQL κατά τη διάρκεια του IRP_MJ_PNP με IRP_MN_START_DEVICE. Αυτό το IRQL συσκευής δεν είναι μια καθολική, σταθερή τιμή, αλλά μάλλον η τιμή που σχετίζεται με μια συγκεκριμένη γραμμή διακοπής.
IRQL έναντι προτεραιότητας νημάτων
Συνιστάται να μην συγχέετε τις έννοιες: Η προτεραιότητα νήματος καθορίζει πότε ο χρονοπρογραμματιστής προεκτελεί και ποιο νήμα εκτελείται; η IRQL ελέγχει τον τύπο δραστηριότητας που μπορεί να εκτελεστεί και ποιες διακοπές καλύπτονται. Πάνω από το DISPATCH_LEVEL, δεν υπάρχει εναλλαγή νημάτων: είναι η IRQL που ελέγχει, όχι η προτεραιότητα των νημάτων.
IRQL και Σελιδοποίηση: Τι δεν πρέπει να κάνετε
Ένα άμεσο αποτέλεσμα της βελτίωσης της IRQL είναι ότι το σύστημα δεν μπορεί να χειριστεί σφάλματα σελίδας. Χρυσός κανόνας: ο κώδικας που εκτελείται σε DISPATCH_LEVEL ή πάνω από αυτό δεν μπορεί να προκαλέσει σφάλματα σελίδας. Στην πράξη, αυτό σημαίνει ότι αυτές οι ρουτίνες και τα δεδομένα που αγγίζουν πρέπει να βρίσκεται σε μη σελιδοποιημένη μνήμηΕπιπλέον, ορισμένοι βοηθοί πυρήνα περιορίζουν τη χρήση τους με βάση το IRQL: για παράδειγμα, KeWaitForSingleObject
Το DISPATCH_LEVEL μπορεί να κληθεί μόνο εάν δεν κάνετε μπλοκάρισμα (μηδενικό χρονικό όριο) και για μη μηδενικά χρονικά όρια, πρέπει να βρίσκεστε κάτω από το DISPATCH_LEVEL.
Έμμεσος και ρητός έλεγχος της IRQL
Τις περισσότερες φορές, Το ίδιο το σύστημα καλεί τις ρουτίνες σας στο σωστό IRQL για το τι πρέπει να κάνουν. Οι ρουτίνες αποστολής για IRP εκτελούνται στο PASSIVE_LEVEL (μπορούν να μπλοκάρουν ή να καλέσουν οποιονδήποτε βοηθό), οι StartIo και DPC εκτελούνται στο DISPATCH_LEVEL για την προστασία των κοινόχρηστων ουρών και οι ISR εκτελούνται στο DIRQL.
Αν χρειάζεται να το ελέγξετε ρητά, Μπορείτε να αυξήσετε και να μειώσετε το IRQL με KeRaiseIrql
y KeLowerIrql
Υπάρχει μια πολύ χρησιμοποιούμενη συντόμευση: KeRaiseIrqlToDpcLevel()
επιστρέφει το προηγούμενο IRQL και σας αφήνει στο DISPATCH_LEVEL. Σημαντικό: Ποτέ μην μειώνετε το IRQL κάτω από την τιμή που είχε όταν σας κάλεσε το σύστημα. Η διακοπή αυτού του συγχρονισμού μπορεί να ανοίξει πολύ σοβαρά παράθυρα ανταγωνισμού.
Σφάλματα μπλε οθόνης που σχετίζονται με το IRQL: IRQL_NOT_LESS_OR_EQUAL και DRIVER_IRQL_NOT_LESS_OR_EQUAL
Δύο κλασικοί έλεγχοι σφαλμάτων που σχετίζονται με αυτά τα προβλήματα είναι IRQL_NOT_LESS_OR_EQUAL (0xA) y DRIVER_IRQL_NOT_LESS_OR_EQUAL (0xD1)Και τα δύο υποδεικνύουν μια προσπάθεια πρόσβασης σε μια σελιδοποιήσιμη (ή μη έγκυρη) διεύθυνση σε ένα IRQL που είναι πολύ υψηλό. Αυτό συνήθως οφείλεται σε προγράμματα οδήγησης που χρησιμοποιούν λανθασμένες διευθύνσεις, σε διαγραφή αναφοράς σε κακούς δείκτες ή σε εκτέλεση σελιδοποιήσιμου κώδικα σε ακατάλληλα επίπεδα.
Στη συγκεκριμένη περίπτωση του DRIVER_IRQL_NOT_LESS_OR_EQUAL (0x000000D1), οι παράμετροι είναι πολύ κατατοπιστικές: 1) διεύθυνση μνήμης αναφοράς· 2) IRQL εκείνη τη στιγμή· 3) τύπος πρόσβασης (0 ανάγνωση, 1 εγγραφή, 2/8 εκτέλεση)· 4) διεύθυνση της εντολής που ανέφερε τη μνήμη. Με το πρόγραμμα εντοπισμού σφαλμάτων μπορείτε να χρησιμοποιήσετε ln
στην παράμετρο 4 για καταγράψτε το πλησιέστερο σύμβολο και μάθετε ποια συνάρτηση εκτελούνταν.
Συνήθεις αιτίες που πρέπει να έχετε κατά νου
Πέρα από τον συγκεκριμένο κώδικα, υπάρχουν μοτίβα που επαναλαμβάνονται. Διαγραφή αναφοράς μη έγκυρου δείκτη σε DISPATCH_LEVEL ή υψηλότερο Αυτή είναι μια σίγουρη συνταγή για καταστροφή. Η πρόσβαση σε δεδομένα σελιδοποιήσιμα σε αυτό το επίπεδο ή η εκτέλεση κώδικα σελιδοποιήσιμου (π.χ., μια συνάρτηση που έχει επισημανθεί ως σελιδοποιήσιμη), ενεργοποιεί επίσης τον έλεγχο σφαλμάτων.
Άλλες συνηθισμένες περιπτώσεις περιλαμβάνουν κλήση μιας συνάρτησης σε άλλο πρόγραμμα οδήγησης που έχει ήδη ληφθεί (κρεμαστός δείκτης συνάρτησης) ή καλείται έμμεσα μέσω ενός μη έγκυρου δείκτη συνάρτησης. Συχνά, εάν το σύστημα είναι σε θέση να αναγνωρίσει μια ενότητα, θα δείτε το όνομά της στην ίδια την μπλε οθόνη και αποθηκεύεται επίσης στο KiBugCheckDriver
, προσβάσιμο με dx KiBugCheckDriver
από το WinDbg.
Μια πρακτική λεπτομέρεια: Στα περισσότερα D1/A, το πραγματικό πρόβλημα δεν είναι η ίδια η IRQL., αλλά μάλλον η αναφερόμενη διεύθυνση μνήμης. Γι' αυτό οι παράμετροι 1, 3 και 4 είναι κρίσιμες για την εστίαση της διάγνωσης.
Διαγνωστικά με WinDbg: Χρήσιμες εντολές και ανάγνωση παραμέτρων
Για να εργαστούμε πάνω σε αυτές τις υποθέσεις, Το WinDbg είναι το βασικό εργαλείοκαι αν το BSOD αναφέρει ntoskrnl.exe Αυτές οι πληροφορίες παρέχουν πολλές οδηγίες σχετικά με το αν το σφάλμα βρίσκεται στο υποσύστημα πυρήνα. Ξεκινήστε από !analyze -v
για να λάβετε μια σύνοψη του ελέγχου σφαλμάτων, της στοίβας και, αν είστε τυχεροί, της εμπλεκόμενης ενότητας. Εάν η απόδειξη περιλαμβάνει ένα πλαίσιο καταγραφής, .trap
σας βάζει στο πλαίσιο της προβληματικής CPU.
Ο εντολές του σωρού ως k
, kb
, kc
, kd
, kp
, kP
, kv
Σας δείχνουν διαφορετικά επίπεδα λεπτομέρειας backtrace. Με ln
στην παράμετρο 4 μπορείτε να παραλείψετε στην εντολή που ανέφερε τη μνήμη και να λάβετε το κοντινό σύμβολο. Και αν υποψιάζεστε ότι το επίπεδο προτεραιότητας εκτελείται πριν από τη διακοπή, !irql
σας δείχνει την αποθηκευμένη IRQL για τον επεξεργαστή-στόχο (π.χ. DISPATCH_LEVEL).
Για να αναλύσουμε την κατεύθυνση της παραμέτρου 1, !pool
Θα σας πει εάν ανήκει σε μια ομάδα σελιδοποιημένων δεδομένων. !address
y !pte
εμβαθύνετε στην αντιστοίχιση μνήμης αυτής της περιοχής. Μπορείτε να χρησιμοποιήσετε οι εντολές εμφάνισης μνήμης για να ελέγξει το περιεχόμενο στο οποίο επιχειρήθηκε η πρόσβαση. Τέλος, u
, ub
, uu
σας επιτρέπουν να αποσυναρμολογήσετε γύρω από τη διεύθυνση της παραμέτρου 4.
Μην ξεχνάτε lm t n
για να παραθέσετε μια λίστα με φορτωμένες ενότητες y !memusage
για τη γενική κατάσταση της μνήμης. Αν KiBugCheckDriver
έχει κάτι, dx KiBugCheckDriver
Θα επιστρέψει το όνομα της ενότητας Unicode: σε ένα τυπικό παράδειγμα, το "Wdf01000.sys" θεωρήθηκε ως το πρόγραμμα οδήγησης που εμπλέκεται κατά τον έλεγχο σφαλμάτων.
Εργαλεία συστήματος: Επαληθευτής προγράμματος οδήγησης, Πρόγραμμα προβολής συμβάντων και Διαγνωστικά
El Επαληθευτής προγράμματος οδήγησης Εξετάζει τη συμπεριφορά των προγραμμάτων οδήγησης σε πραγματικό χρόνο και επιβάλλει σφάλματα όταν ανιχνεύει λανθασμένη χρήση πόρων (όπως η ομάδα), δημιουργώντας μια εξαίρεση για να απομονώσει την προβληματική περιοχή του κώδικα. Εκκινείται με verifier
από γραμμή εντολών και συνιστάται να επιλέξετε το μικρότερο δυνατό σύνολο προγραμμάτων οδήγησης για να αποφύγετε την προσθήκη υπερβολικού κόστους.
Αν δεν βλέπετε τον εαυτό σας με WinDbg, εφαρμόστε βασικά μέτραΕλέγξτε το αρχείο καταγραφής συστήματος στην Προβολή Συμβάντων για σφάλματα που υποδεικνύουν μια συγκεκριμένη συσκευή/πρόγραμμα οδήγησης. Ενημερώστε ή απενεργοποιήστε το πρόγραμμα οδήγησης που αναφέρεται από την μπλε οθόνη. Επαληθεύστε τη συμβατότητα υλικού με την έκδοση των Windows που διαθέτετε και χρησιμοποιήστε το Διαγνωστικό μνήμης των Windows εάν υποψιάζεστε ότι υπάρχει μνήμη RAM. Αυτές οι ενέργειες, αν και απλές, λύνουν έναν μεγάλο αριθμό υποθέσεων.
Πραγματικές περιπτώσεις: Όταν τα BSOD φαίνονται τυχαία
Ένας χρήστης με Windows 10 Pro (επεξεργαστής AMD Ryzen 5 3400G, GPU NVIDIA GeForce GTX 1660 Ti και πλακέτα Gigabyte B450 AORUS PRO WIFI, 16 GB RAM) αντιμετώπιζε διαλείποντα μηνύματα οθόνης "IRQL_LESS_OR_NOT_EQUAL". Είχα ήδη ενημερώσει τα απαραίτητα προγράμματα οδήγησης (δικτύου, γραφικών), είχα εγκαταστήσει όλες τις ενημερώσεις των Windows και είχα εκτελέσει το εργαλείο μνήμης, όλα χωρίς να εντοπίσω κανένα πρόβλημα.
Σε σενάρια όπως αυτό, Το επόμενο βήμα είναι η ανάλυση dumps με το WinDbg και αναζητήστε μοτίβα: διαδικασίες που εμπλέκονται όταν πέφτει (για παράδειγμα, explorer.exe
), ενότητες γραφικής διεπαφής (win32kfull.sys
) και λειτουργίες όπως xxxProcessNotifyWinEvent
που εμφανίζεται στη στοίβα. Παρόλο που αυτή η ενότητα είναι Windows, η ενεργοποίηση είναι συχνά ένα πρόγραμμα οδήγησης τρίτου κατασκευαστή (γραφικά, είσοδος, επικάλυψη, κάρτες καταγραφής) που χρησιμοποιεί μνήμη με ακατάλληλο IRQL και το σφάλμα προκύπτει εντός win32k
.
Η πρακτική συμβουλή εδώ είναι προσωρινή απενεργοποίηση λογισμικού επικάλυψης (καταγραφή, GPU OSD), προγράμματα οδήγησης περιφερειακών με επιθετικό λογισμικό (ποντίκια/πληκτρολόγια με μακροεντολές) και εκδόσεις beta των προγραμμάτων οδήγησης γραφικών, και να το περιορίσετε. Η χρήση του Driver Verifier σε ύποπτους χρήστες μπορεί να βοηθήσει στον περιορισμό του προβλήματος με μια πιο σαφή στοίβα.
Ένα πολύ συνηθισμένο μοτίβο δικτύου: το ndis.sys δεν είναι πάντα η αιτία
Μια άλλη χαρακτηριστική περίπτωση: στιγμιότυπο οθόνης με το ndis.sys (το επίπεδο δικτύου των Windows). Σε έναν πραγματικό υπολογιστή, το σύστημα θα κατέρρεε αμέσως κατά την εκκίνηση. Η πρακτική λύση ήταν η εκκίνηση σε Ασφαλής λειτουργία χωρίς λειτουργίες δικτύου, ανοίξτε το Διαχείριση συσκευών και απενεργοποιήστε τους προσαρμογείς στην ενότητα "Προσαρμογείς δικτύου" για να απομονώσετε το πρόβλημα.
Σε εκείνη την ομάδα υπήρχε ένας Ελεγκτής οικογένειας Realtek PCIe GBE και Atheros AR5007GΑπενεργοποιώντας και τα δύο, εντοπίστηκε ότι η πραγματική αιτία ήταν η athrx.sys
(Atheros), αν και η μπλε οθόνη που αναφέρθηκε ndis.sys
Η απόρριψη το επιβεβαίωσε αυτό: η στοίβα πέρασε από ndis!NdisFreeTimerObject
αλλά η ένοχη ενότητα ήταν athrx.sys
Η τελική διόρθωση ήταν απεγκαταστήστε τη συσκευή και εγκαταστήστε ενημερωμένα επίσημα προγράμματα οδήγησης Από την ιστοσελίδα του κατασκευαστή του Atheros. Ηθικό δίδαγμα: Η ενότητα που αναφέρεται στο BSOD μπορεί να είναι μέρος του επηρεαζόμενου υποσυστήματος, όχι η πηγή.
Τυπική απάντηση υποστήριξης και γρήγορα βήματα για χρήστες
Σε μια γνήσια ανταλλαγή υποστήριξης, ένας τεχνικός απάντησε: "Λυπάμαι για την αναστάτωση. Μπορεί να πρόκειται για πρόβλημα προγράμματος οδήγησης, μνήμης ή antivirus. Ενημερώστε τα προγράμματα οδήγησης και, εάν το πρόβλημα επιμένει, εκτελέστε τον διαγνωστικό έλεγχο μνήμης."Αυτή είναι μια βασική αλλά έγκυρη συμβουλή. Ωστόσο, εάν τα σφάλματα επιμένουν, είναι καλή ιδέα να προχωρήσετε περαιτέρω με το Verifier και την ανάλυση dump.
Για μη τεχνικούς χρήστες, ένα λογικό πρωτόκολλο θα ήταν: 1) Έλεγχος συμβάντων συστήματος, 2) Ενημέρωση βασικών προγραμμάτων οδήγησης (chipset/δίκτυο/γραφικά), 3) Έλεγχος μνήμης RAM με το ενσωματωμένο εργαλείο, 4) δοκιμή εκκίνηση καθαρίστε χωρίς λογισμικό τρίτων που εισάγει hooks στον πυρήνα/GUI και 5) χρησιμοποιήστε το Verifier σε προγράμματα οδήγησης τρίτων εάν δεν υπάρχει τίποτα σαφές.
Βέλτιστες πρακτικές για προγραμματιστές προγραμμάτων οδήγησης
Εάν αναπτύσσετε και πέσετε πάνω στο D1/A, ελέγξτε ότι το Η ρουτίνα εκτέλεσης δεν έχει επισημανθεί ως σελιδοποιήσιμη Μην καλείτε συναρτήσεις με δυνατότητα σελιδοποίησης ενώ εκτελούνται σε DISPATCH_LEVEL ή υψηλότερο. Αυτό περιλαμβάνει την αποφυγή αναφορών σε δεδομένα σε σελιδοποιημένες ενότητες και τον σεβασμό των περιορισμών IRQL για τους βοηθούς πυρήνα που περιγράφονται στο DDK.
Για να συγχρονίσετε τα κοινόχρηστα δεδομένα, εφαρμόστε τον κανόνα "να έχετε πάντα πρόσβαση σε κοινόχρηστα δεδομένα με το ίδιο υψηλό IRQL" και χρησιμοποιήστε κλειδώματα περιστροφής όταν είναι απαραίτητο. Σε πολυεπεξεργαστές, το IRQL από μόνο του δεν εγγυάται τον αποκλεισμό μεταξύ διαφορετικών CPU. Τα κλειδώματα περιστροφής αυξάνουν το IRQL (στο ΕΠΙΠΕΔΟ DISPATCH) και συντονίζουν την πρόσβαση μεταξύ πυρήνων. Εάν χρειάζεται να λειτουργήσετε σε ευαίσθητα μητρώα υλικού, KeSynchronizeExecution
σας βοηθά να εκτελέσετε κρίσιμες ενότητες στο σωστό DIRQL.
Όταν το σχέδιο απαιτεί βελτίωση της IRQL, χρήσεις KeRaiseIrqlToDpcLevel
για ΕΠΙΠΕΔΟ ΑΠΟΣΤΟΛΗΣ ή KeRaiseIrql
προσεκτικά, αποθηκεύοντας την προηγούμενη IRQL και επαναφέροντάς την ακριβώς με KeLowerIrql
Πηγαίνετε κάτω από την IRQL εισόδου, έστω και για μια στιγμή, Είναι ένα σοβαρό σφάλμα συγχρονισμού.
Σχέση με διακοπές και υλικό
Το IRQL είναι ο μηχανισμός με τον οποίο τα Windows οι παραγγελίες διακόπτουν τις προτεραιότητες και ορισμένες εσωτερικές εργασίεςΣε αρχιτεκτονικό επίπεδο, σχετίζεται με έννοιες όπως «Διακοπή», «Χειριστής διακοπών» ή «Επίπεδο προτεραιότητας διακοπών» και, σε κλασικές πλατφόρμες, με το Προγραμματιζόμενος ελεγκτής διακοπών (PIC)Σε άλλα συστήματα, ο έλεγχος προτεραιοτήτων εκφράζεται μέσω μηχανισμών όπως spl en UnixΗ γενική ιδέα είναι η ίδια: ποιος μπορεί να διακόψει ποιον.
Συμβουλές για προχωρημένους για εντοπισμό σφαλμάτων
Σε χωματερές όπου η στοίβα δείχνει προς win32kfull!xxxProcessNotifyWinEvent
με έλεγχο σφαλμάτων 0xA/0xD1, ελέγξτε το περιβάλλον με .process
y .thread
(εάν είναι διαθέσιμο), εξετάστε διαδικασίες όπως explorer.exe
en !process 0 1
και ελέγξτε τις επικαλύψεις και τα προγράμματα οδήγησης αλληλεπίδρασης GUI. Πολλές φορές το πρόβλημα Είναι μνήμη που έχει καταστραφεί από ένα τρίτο μέρος που εμφανίζεται σε αυτή τη διαδρομή.
Μην ξεχάσετε να ελέγξετε το IRQL με !irql
, και αντίθεση: αν βρίσκεστε στο DISPATCH_LEVEL (2) και η παράμετρος 3 υποδεικνύει ανάγνωση/εγγραφή/εκτέλεση σε μια σελίδα με δυνατότητα σελιδοποίησης, έχετε ήδη μια ένδειξη για το γιατί έχει πέσει. Διασταυρώστε αυτήν την ένδειξη με ln
στην παράμετρο 4 για να λάβετε τη συγκεκριμένη συνάρτηση.
Καταλάβετε Τι είναι το IRQL; και ο τρόπος με τον οποίο εντάσσεται στην εκτέλεση του πυρήνα βοηθά στον διαχωρισμό του θορύβου από τα σήματα. Εάν είστε χρήστης, εστιάστε στο προγράμματα οδήγησης και υλικό (με Verifier, συμβάντα και δοκιμές από προεπιλογή). Εάν αναπτύσσετε, ακολουθήστε αυστηρά τους κανόνες για IRQL, μη σελιδοποιημένη μνήμη και συγχρονισμό με κλειδώματα περιστροφής. Με τα σωστά εργαλεία (WinDbg, Verifier) και προσεκτική ανάγνωση των παραμέτρων (1, 3 και 4), Αυτοί οι έλεγχοι σφαλμάτων δεν αποτελούν πλέον μυστήριο και γίνονται προβλήματα που μπορούν να αντιμετωπιστούν μεθοδικά.
Παθιασμένος συγγραφέας για τον κόσμο των byte και της τεχνολογίας γενικότερα. Μου αρέσει να μοιράζομαι τις γνώσεις μου μέσω της γραφής, και αυτό θα κάνω σε αυτό το blog, θα σας δείξω όλα τα πιο ενδιαφέροντα πράγματα σχετικά με τα gadget, το λογισμικό, το υλικό, τις τεχνολογικές τάσεις και πολλά άλλα. Στόχος μου είναι να σας βοηθήσω να περιηγηθείτε στον ψηφιακό κόσμο με απλό και διασκεδαστικό τρόπο.