Ο πυρήνας Linux 5.12 έχει υιοθετήσει το υποσύστημα KFence για τον εντοπισμό σφαλμάτων κατά την εργασία με μνήμη

Ο πυρήνας Linux 5.12, ο οποίος βρίσκεται υπό ανάπτυξη, περιλαμβάνει μια υλοποίηση του μηχανισμού KFence (Kernel Electric Fence), ο οποίος ελέγχει τον χειρισμό της μνήμης, την καταγραφή υπερβάσεων buffer, τις προσβάσεις στη μνήμη μετά την απελευθέρωση και άλλα σφάλματα παρόμοιας κλάσης.

Παρόμοια λειτουργικότητα ήταν ήδη παρούσα στον πυρήνα με τη μορφή της επιλογής κατασκευής KASAN (πυρήνα διεύθυνσης sanitizer, χρησιμοποιεί Address Sanitizer σε σύγχρονο gcc και clang) - ωστόσο, τοποθετήθηκε κυρίως για χρήση εντοπισμού σφαλμάτων. Το υποσύστημα KFence διαφέρει από το KASAN στην υψηλή ταχύτητα λειτουργίας του, γεγονός που καθιστά δυνατή τη χρήση αυτής της δυνατότητας ακόμη και σε πυρήνες σε συστήματα εργασίας.

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

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

Έτσι, οι σελίδες με αντικείμενα διαχωρίζονται μεταξύ τους με σελίδες προστασίας, οι οποίες είναι ρυθμισμένες να δημιουργούν ένα «σφάλμα σελίδας» σε οποιαδήποτε πρόσβαση. Για τον εντοπισμό εγγραφών εκτός ορίων εντός σελίδων αντικειμένων, χρησιμοποιούνται επιπλέον «κόκκινες ζώνες» βασισμένες σε μοτίβα, οι οποίες καταλαμβάνουν μνήμη που δεν χρησιμοποιείται από αντικείμενα, ενώ παραμένει όταν το μέγεθος των σελίδων μνήμης είναι ευθυγραμμισμένο. —+————+————+————+————+————+— | xxxxxxxxx | Ο: | xxxxxxxxx | :O | xxxxxxxxx | | xxxxxxxxx | Β: | xxxxxxxxx | :B | xxxxxxxxx | | x ΦΥΛΑΚΑΣ x | J : ΚΟΚΚΙΝΟ- | x ΦΥΛΑΚΑΣ x | ΚΟΚΚΙΝΟ- : J | x ΦΥΛΑΚΑΣ x | | xxxxxxxxx | E: ΖΩΝΗ | xxxxxxxxx | ΖΩΝΗ: E | xxxxxxxxx | | xxxxxxxxx | Γ: | xxxxxxxxx | :C | xxxxxxxxx | | xxxxxxxxx | Τ: | xxxxxxxxx | : T | xxxxxxxxx | —+————+————+————+————+————+—

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

Πηγή: opennet.ru

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