Le noyau Linux 5.12 a adopté le sous-système KFence pour détecter les erreurs lors du travail avec la mémoire

Le noyau Linux 5.12, en cours de développement, inclut une implémentation du mécanisme KFence (Kernel Electric Fence), qui vérifie la gestion de la mémoire, détecte les dépassements de tampon, les accès à la mémoire après la libération et d'autres erreurs d'une classe similaire.

Une fonctionnalité similaire était déjà présente dans le noyau sous la forme de l'option de construction KASAN (sainisseur d'adresses du noyau, utilise Address Sanitizer dans gcc et clang modernes) - cependant, elle était principalement positionnée pour une utilisation de débogage. Le sous-système KFence diffère de KASAN par sa vitesse de fonctionnement élevée, ce qui permet d'utiliser cette fonctionnalité même sur les cœurs des systèmes en état de marche.

L'application sur les systèmes de production permettra de détecter les erreurs de mémoire qui n'apparaissent pas lors des tests et n'apparaissent que pendant les charges de travail ou lors d'un fonctionnement à long terme (avec une disponibilité importante). De plus, l'utilisation de KFence sur les systèmes de production permettra d'augmenter considérablement le nombre de machines impliquées dans la vérification du fonctionnement du noyau avec la mémoire.

KFence atteint une surcharge minimale indépendante de la charge en insérant des pages de garde dans le tas à intervalles fixes. Une fois l'intervalle de protection suivant expiré, KFence, via le système d'allocation de mémoire standard (allocateur SLAB ou SLUB), ajoute la page de protection suivante à partir du pool d'objets KFence et démarre un nouveau rapport de compteur de temps. Chaque objet KFence est situé dans une page mémoire distincte, et les pages mémoire le long des bordures gauche et droite forment des pages de garde dont la taille est choisie aléatoirement.

Ainsi, les pages contenant des objets sont séparées les unes des autres par des pages de protection, qui sont configurées pour générer un « défaut de page » à tout accès. Pour détecter les écritures hors limites à l'intérieur des pages d'objets, des « zones rouges » basées sur des modèles sont également utilisées, qui occupent de la mémoire non utilisée par les objets et qui restent lorsque la taille des pages mémoire est alignée. —+————+————+————+————+————+— | xxxxxxxxx | O : | xxxxxxxxx | :O | xxxxxxxxx | | xxxxxxxxx | B : | xxxxxxxxx | :B | xxxxxxxxx | | x GARDE x | J : ROUGE- | x GARDE x | ROUGE- : J | x GARDE x | | xxxxxxxxx | E : ZONE | xxxxxxxxx | ZONE : E | xxxxxxxxx | | xxxxxxxxx | C : | xxxxxxxxx | :C | xxxxxxxxx | | xxxxxxxxx | T : | xxxxxxxxx | : T | xxxxxxxxx | —+————+————+————+————+————+—

Si une tentative est faite pour accéder à une zone en dehors des limites du tampon, l'opération affecte la page de protection, ce qui conduit à la génération d'un « défaut de page », qui intercepte KFence et enregistre des informations sur le problème identifié. Par défaut, KFence ne bloque pas une erreur et affiche uniquement un avertissement dans le journal, mais il existe un paramètre « panic_on_warn » qui vous permet de mettre le noyau dans un état de panique si une erreur est détectée.

Source: opennet.ru

Ajouter un commentaire