O núcleo Linux 5.12 adoptou o subsistema KFence para detectar erros ao traballar coa memoria

O kernel de Linux 5.12, que está en desenvolvemento, inclúe unha implementación do mecanismo KFence (Kernel Electric Fence), que comproba o manexo da memoria, detecta os excesos de memoria intermedia, os accesos á memoria despois da liberación e outros erros dunha clase similar.

Unha funcionalidade similar xa estaba presente no núcleo en forma da opción de compilación KASAN (desinfectante de enderezos do núcleo, usa o desinfectante de enderezos nos modernos gcc e clang); con todo, situouse principalmente para o uso de depuración. O subsistema KFence diferénciase de KASAN pola súa alta velocidade de funcionamento, o que fai posible utilizar esta función mesmo nos núcleos dos sistemas de traballo.

A aplicación en sistemas de produción permitirá detectar erros de memoria que non aparecen nas probas e só aparecen durante as cargas de traballo ou durante un funcionamento a longo prazo (cun ​​tempo de actividade grande). Ademais, o uso de KFence nos sistemas de produción permitirá aumentar significativamente o número de máquinas implicadas na comprobación do funcionamento do núcleo con memoria.

KFence consegue unha sobrecarga mínima independente da carga ao inserir páxinas de garda no montón a intervalos fixos. Despois de que expirou o seguinte intervalo de protección, KFence, a través do sistema de asignación de memoria estándar (asignador SLAB ou SLUB), engade a seguinte páxina de protección do grupo de obxectos KFence e inicia un novo informe de contador de tempo. Cada obxecto KFence está situado nunha páxina de memoria separada, e as páxinas de memoria ao longo dos bordos esquerdo e dereito forman páxinas de garda, cuxo tamaño se escolle aleatoriamente.

Así, as páxinas con obxectos están separadas entre si por páxinas de protección, que están configuradas para xerar un "error de páxina" en calquera acceso. Para detectar escrituras fóra dos límites dentro das páxinas de obxectos, utilízanse ademais "zonas vermellas" baseadas en patróns, que ocupan a memoria que non usan os obxectos, quedando cando se aliña o tamaño das páxinas de memoria. —+————+————+————+————+————+— | xxxxxxxxx | O: | xxxxxxxxx | :O | xxxxxxxxx | | xxxxxxxxx | B: | xxxxxxxxx | :B | xxxxxxxxx | | x GARDA x | J: VERMELLO- | x GARDA x | VERMELLO: J | x GARDA x | | xxxxxxxxx | E: ZONA | xxxxxxxxx | ZONA: E | xxxxxxxxx | | xxxxxxxxx | C: | xxxxxxxxx | :C | xxxxxxxxx | | xxxxxxxxx | T: | xxxxxxxxx | : T | xxxxxxxxx | —+————+————+————+————+————+—

Se se intenta acceder a unha área fóra dos límites do búfer, a operación afecta á páxina de protección, o que leva á xeración dun "fallo de páxina", que intercepta KFence e rexistra información sobre o problema identificado. Por defecto, KFence non bloquea un erro e só mostra unha advertencia no rexistro, pero hai unha configuración "panic_on_warn" que lle permite poñer o núcleo en estado de pánico se se detecta un erro.

Fonte: opennet.ru

Engadir un comentario