O kernel Linux 5.12 adotou o subsistema KFence para detectar erros ao trabalhar com memória

O kernel Linux 5.12, que está em desenvolvimento, inclui uma implementação do mecanismo KFence (Kernel Electric Fence), que verifica o manuseio da memória, captura de saturação de buffer, acessos à memória após liberação e outros erros de classe semelhante.

Funcionalidade semelhante já estava presente no kernel na forma da opção de construção KASAN (kernel address sanitizer, usa Address Sanitizer no gcc e clang modernos) - no entanto, foi posicionada principalmente para uso de depuração. O subsistema KFence difere do KASAN pela alta velocidade operacional, o que possibilita a utilização desse recurso até mesmo em núcleos de sistemas em funcionamento.

A aplicação em sistemas de produção permitirá detectar erros de memória que não aparecem nas execuções de teste e só aparecem durante cargas de trabalho ou durante operação de longo prazo (com grande tempo de atividade). Além disso, a utilização do KFence em sistemas de produção permitirá aumentar significativamente o número de máquinas envolvidas na verificação do funcionamento do kernel com memória.

O KFence atinge uma sobrecarga mínima independente de carga, inserindo páginas de proteção no heap em intervalos fixos. Depois que o próximo intervalo de proteção expirar, o KFence, por meio do sistema de alocação de memória padrão (SLAB ou alocador SLUB), adiciona a próxima página de proteção do conjunto de objetos do KFence e inicia um novo relatório de contador de tempo. Cada objeto do KFence está localizado em uma página de memória separada, e as páginas de memória ao longo das bordas esquerda e direita formam páginas de proteção, cujo tamanho é escolhido aleatoriamente.

Assim, as páginas com objetos são separadas umas das outras por páginas de proteção, que são configuradas para gerar uma “falha de página” em qualquer acesso. Para detectar gravações fora do limite dentro das páginas dos objetos, são utilizadas adicionalmente “zonas vermelhas” baseadas em padrões, que ocupam memória não utilizada pelos objetos, permanecendo quando o tamanho das páginas de memória é alinhado. —+————+————+————+————+— | xxxxxxxxx | Ó: | xxxxxxxxx | :O | xxxxxxxxx | | xxxxxxxxx | B: | xxxxxxxxx | :B | xxxxxxxxx | | x GUARDA x | J: VERMELHO- | x GUARDA x | VERMELHO-: J | x GUARDA x | | xxxxxxxxx | E: ZONA | xxxxxxxxx | ZONA: E | xxxxxxxxx | | xxxxxxxxx | C: | xxxxxxxxx | :C | xxxxxxxxx | | xxxxxxxxx | T: | xxxxxxxxx | : T | xxxxxxxxx | —+————+————+————+————+—

Caso seja feita uma tentativa de acesso a uma área fora dos limites do buffer, a operação afeta a página de proteção, o que leva à geração de uma “falha de página”, que intercepta o KFence e registra informações sobre o problema identificado. Por padrão, o KFence não bloqueia um erro e apenas exibe um aviso no log, mas há uma configuração “panic_on_warn” que permite colocar o kernel em estado de pânico se um erro for detectado.

Fonte: opennet.ru

Adicionar um comentário