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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top