El nucli Linux 5.12 ha adoptat el subsistema KFence per detectar errors quan es treballa amb memòria

El nucli de Linux 5.12, que està en desenvolupament, inclou una implementació del mecanisme KFence (Kernel Electric Fence), que comprova el maneig de la memòria, la captura d'excés de memòria intermèdia, els accessos a la memòria després de l'alliberament i altres errors d'una classe similar.

Una funcionalitat similar ja estava present al nucli en forma de l'opció de compilació KASAN (desinfectador d'adreces del nucli, utilitza Address Sanitizer en gcc modern i clang) - tanmateix, es va posicionar principalment per a l'ús de depuració. El subsistema KFence es diferencia de KASAN per la seva alta velocitat de funcionament, que permet utilitzar aquesta característica fins i tot en nuclis en sistemes de treball.

L'aplicació en sistemes de producció permetrà detectar errors de memòria que no apareixen en les proves i només apareixen durant les càrregues de treball o durant un funcionament a llarg termini (amb un gran temps de funcionament). A més, l'ús de KFence en sistemes de producció permetrà augmentar significativament el nombre de màquines implicades en la comprovació del funcionament del nucli amb memòria.

KFence aconsegueix una sobrecàrrega mínima independent de la càrrega mitjançant la inserció de pàgines de guàrdia al munt a intervals fixos. Un cop ha expirat el següent interval de protecció, KFence, mitjançant el sistema d'assignació de memòria estàndard (assignador SLAB o SLUB), afegeix la següent pàgina de protecció del grup d'objectes KFence i inicia un nou informe de comptador de temps. Cada objecte KFence es troba en una pàgina de memòria independent i les pàgines de memòria al llarg de les vores esquerra i dreta formen pàgines de protecció, la mida de les quals s'escull aleatòriament.

Així, les pàgines amb objectes estan separades entre si per pàgines de protecció, que estan configurades per generar un "error de pàgina" en qualsevol accés. Per detectar escriptures fora del límit dins de les pàgines d'objectes, també s'utilitzen "zones vermelles" basades en patrons, que ocupen la memòria no utilitzada pels objectes, que romanen quan la mida de les pàgines de memòria està alineada. —+————+————+————+————+————+— | xxxxxxxxx | O: | xxxxxxxxx | :O | xxxxxxxxx | | xxxxxxxxx | B: | xxxxxxxxx | :B | xxxxxxxxx | | x GUARDA x | J: VERMELL- | x GUARDA x | VERMELL-: J | x GUARDA x | | xxxxxxxxx | E: ZONA | xxxxxxxxx | ZONA: E | xxxxxxxxx | | xxxxxxxxx | C: | xxxxxxxxx | :C | xxxxxxxxx | | xxxxxxxxx | T: | xxxxxxxxx | : T | xxxxxxxxx | —+————+————+————+————+————+—

Si s'intenta accedir a una àrea fora dels límits de la memòria intermèdia, l'operació afecta la pàgina de protecció, la qual cosa condueix a la generació d'un "error de pàgina", que intercepta KFence i registra informació sobre el problema identificat. Per defecte, KFence no bloqueja un error i només mostra un avís al registre, però hi ha una configuració "panic_on_warn" que us permet posar el nucli en estat de pànic si es detecta un error.

Font: opennet.ru

Afegeix comentari