uso de memória de um módulo do kernel
-
20-08-2019 - |
Pergunta
Ao tentar estimar a quantidade de memória consumida por um módulo do kernel (geralmente drivers de dispositivo), eu tentei usar o tamanho utilidade que deu o tamanho das áreas de memória estática do .ko (. bss, .data, .text etc). Então, eu estava esperando a soma desses valores a ser exatamente igual à saída dado pelo lsmod comando imediatamente após a inserção do módulo.
Sem alocação dinâmica de memória (kmalloc ou vmalloc) é realizado na função init () para garantir que ele não está causando o difference.So porque é que há uma incompatibilidade?
Curiosamente a incompatibilidade foi encontrado para ser um valor fixo na maioria das vezes !!
As saídas de comando são listadas abaixo
tamanho chardev.ko
text data bss dec hex filename
172 448 1024016 1024636 fa27c chardev.ko
lsmod
Module Size Used by Tainted: P
chardev 1025040 0 - Live 0xc009d000
Solução
Você menciona que nenhuma alocação é feita na função init, mas o que levem em conta chamadas como register_chrdev (9) que alocar memória interna para a instância dispositivo? O comentário que é uma diferença constante faz-me pergunto se isso pode ser a causa.
Outras dicas
Pode ser as funções utilizadas pelo módulo são contados para o tamanho do módulo? Tentar
cat /proc/kallsyms | grep module_name
A diferença entre os dois tamanho é 404. Texto + dados + 404 = 1024. Pode ser que isso é algum tipo de problema granularidade? Eu não sei como o tamanho é calculado dentro do kernel ...
No entanto, o código do kernel e os dados são alocados usando memória dinâmica. E usos kmalloc pré-alocados bloco de memória, por isso, é bastante provável que haja algum arredondamento para cima quando as seções de código e dados são alocados.
Tente aumentar o tamanho das seções de dados e ver se o lsmod relatou mudança de tamanho
Sem mais informações, estou tentado a supor que sua sobrecarga de depuração. Eu digo tentado, porque eu não tenho a configuração do kernel.