a memória alocada por kmalloc() é liberada automaticamente?
-
11-12-2019 - |
Pergunta
Estou escrevendo um driver de dispositivo que, entre outras coisas, aloca um bloco de memória com kmalloc
.Esta memória é liberada quando o programa do usuário fecha o arquivo.Em um dos meus experimentos, o programa do usuário travou sem fechar o arquivo.
Alguma coisa teria libertado essa memória?
Em outro experimento, movi o kfree()
de close()
função para o module_exit()
função.Quando executei o programa do usuário duas vezes consecutivas, chamei kmalloc
novamente com o mesmo ponteiro de antes, sem liberá-lo primeiro.Assim, perdi um ponteiro para essa memória e não consigo liberá-la.
Essa memória será perdida no sistema até a reinicialização ou será liberada quando eu descarregar o driver?
Solução
A memória do kernel nunca é liberada automaticamente.Isso inclui kmalloc
.
Toda a memória relacionada a um descritor de arquivo aberto deve ser liberada quando o arquivo for fechado.
Quando um processo é encerrado, por qualquer motivo (incluindo kill -9
), todos os descritores de arquivo abertos serão fechados e a função close do driver será chamada.Portanto, se você liberar lá, nada que o processo possa fazer fará com que a memória permaneça após a morte do processo.
Outras dicas
Por favor, não relacione sua experiência no espaço do usuário com a programação do Kernel.
O que quero dizer com isso?
Os processos normais são limpos assim que saem, o que não é o caso dos módulos do kernel porque eles não são realmente processos.
Tecnicamente, quando você carrega um módulo e depois chama kmalloc, o que você fez foi pedir ao kernel para alocar alguma memória para você no espaço do kernel, é tecnicamente uma nova memória para todo o kernel, então mesmo se você descarregar seu módulo, isso a memória do kernel alocada existe, a menos que seja explicitamente liberada.
Em termos simples, respondendo à sua pergunta:Todo kmalloc precisa de um kfree, caso contrário a memória permanecerá lá enquanto o sistema estiver funcionando.