Patch para Kernel Linux combate falha de boot em máquinas virtuais x86 com PVH e KASAN

Patch para Kernel Linux combate falha de boot em máquinas virtuais x86 com PVH e KASAN

Desenvolvedores da comunidade do Kernel Linux estão ajustando a inicialização de máquinas virtuais x86 em ambientes que combinam virtualização PVH (Paravirtualized Hardware) e a ferramenta de detecção de erros de memória KASAN (KernelAddressSanitizer). O engenheiro Mauricio Faria de Oliveira, da Igalia, enviou uma série de patches à lista de discussão LKML para corrigir falhas de boot que impedem a inicialização direta via vmlinux em compiladores recentes como GCC 14 e GCC 15.

Entenda o problema sem termos técnicos

Para entender o cenário, vale imaginar a inicialização do sistema como os primeiros segundos de partida de um computador. Quando uma máquina virtual Linux é iniciada no modo PVH, o sistema precisa realizar verificações básicas do processador antes de ativar seus mecanismos avançados de segurança.

A ferramenta KASAN funciona como um inspetor que monitora todos os acessos à memória para encontrar erros de programação. No entanto, esse inspetor só pode começar a trabalhar depois de ser totalmente configurado durante o processo de boot.

Se o Kernel tentar consultar o inspetor antes da hora, o sistema entra em colapso e reinicia continuamente. É exatamente essa falha de sincronia que afeta a inicialização de máquinas virtuais em certas combinações de compiladores e configurações.

Por que os builtins do compilador falharam

Anteriormente, o código do Kernel Linux utilizava funções nativas do compilador, conhecidas como builtins, a exemplo de __builtin_memcmp() e __builtin_memset(). A intenção era garantir que as comparações e preenchimentos de memória fossem embutidos diretamente na rotina de boot sem chamar as funções padrão do sistema.

Com o lançamento das versões 14 e 15 do compilador GCC (GNU Compiler Collection), a otimização mudou. Em determinadas condições, o compilador decidiu substituir o código embutido por chamadas para a função memcmp() localizada em lib/string.c.

Como a biblioteca padrão de strings do Kernel possui checagens do KASAN, a chamada prematura provocava um erro de acesso à memória não inicializada. O resultado era um ciclo infinito de reinicialização no emulador QEMU (Quick Emulator).

A solução com assembly inline e o debate entre mantenedores

Para eliminar a dependência das decisões do compilador, a proposta de Mauricio Faria de Oliveira substitui os builtins por rotinas diretas em linguagem de montagem x86. Com a introdução do cabeçalho <asm/shared/string.h>, o Kernel passa a utilizar rotinas como __inline_memcmp() e __inline_memset().

Durante as discussões da versão v7 da série, mantenedores como Borislav Petkov e H. Peter Anvin analisaram detalhes de desempenho e tamanho de código. Eles sugeriram ajustes no tratamento de comparações com tamanho zero e no uso de instruções como REPE e CMPSB.

Com base nas observações enviadas pela comunidade, o autor já estruturou uma nova revisão da proposta. A mudança garante estabilidade na inicialização de ambientes de testes e desenvolvimento sem afetar o comportamento de imagens tradicionais do tipo bzImage.