Linux Modules – O que são e como funcionam

January 21st, 2004

Category: Linux

Tagged with:

O desenvolvimento de uma nova funcionalidade para o kernel do Linux pode ser implementada diretamente no Kernel ou compilada como um módulo.


De modo geral, a escolha tende a ser a compilação como módulo. Isso se traduz no carregamento dinâmico do código apenas quando esta funcionalidade for necessária. Além disso, torna o kernel mais enxuto, leve, e portanto mais eficiente. Diversos componentes do kernel do Linux são implementados como módulos, por exemplo, filesystems, device drivers, e novas camadas de protocolos de comunicação.
Em alguns casos, compilar o código juntamente com o kernel pode ser necessário. Se um determinado componente precisa alterar alguma estrutura do kernel, ele não terá privilégios de fazer isso dinamicamente, ou mesmo que gere sua própria estrutura modificada, o restante do kernel e outros módulos carregados ainda estarão enxergando a antiga estrutura.
Ao executar o comando lsmod você pode ver quais módulos estão carregados atualmente no seu kernel. Abaixo um exemplo da saída deste comando.

Module 		Size    Used    by            Tainted: P
ppp_generic    24060    0    (autoclean) (unused)
slhc            6564    0    (autoclean) [ppp_generic]
ircomm-tty     24224    0    (autoclean) (unused)
ircomm          9736    0    (autoclean) [ircomm-tty]
irda          112112    0    (autoclean) [ircomm-tty ircomm]
lp              8096    0    (autoclean)(unused)
parport        34176    0     (autoclean) [lp]
printer         8448    0    (unused)
agpgart        40896    3    (autoclean)
nvidia       1765632   11    (autoclean)
i810_audio     26312    0
soundcore       6276    0     [i810_audio]
ac97_codec     12488    0    [i810_audio]
nfsd           74256    8    (autoclean)

Observe a coluna Used. Ela reflete quantos processos estão fazendo uso do módulo. Todo módulo deve implementar um campo na sua estrutura de dados denominado usage counter para esta finalidade. Um módulo só pode ser removido da memória se o seu usage counter for zero.
Os módulos são carregados através do programa insmod e uma estrutura do tipo module é alocada quando seu carregamento é solicitado. Esta estrutura contém símbolos globais que podem ser vistos pelo kernel e outros módulos, informando os pontos de entrada de suas funções, suas variáveis globais, seu usage counter, flags, entre outros.
Algumas vezes, um módulo depende de outro para realizar determinadas operações. Outro campo na estrutura module é utilizado para informar as dependências dele. Se o módulo B depende de A, este deve ser carregado antes de ser possível carregar B. O usage counter de A é incrementado sempre que um módulo que depende dele é carregado. Deste modo, não se permite que A seja removido antes de seus dependentes.
O kernel provê o comando modprobe para facilitar o gerenciamento de dependências. Este comando tenta carregar automaticamente qualquer dependência do módulo solicitado. Por exemplo, ao tentar carregar o módulo MS-DOS, o comando modprobe carrega primeiro o módulo fat, seguido por MS-DOS.
O comando modprobe faz uso de um arquivo chamado modules.dep para determinar as dependências de todos os módulos compilados para o kernel corrente. Este arquivo é gerado pela execução, no start-up da máquina, de outro programa chamado depmod. Ele avalia, durante o carregamento inicial do kernel, todos os módulos compilados, normalmente armazenados em /lib/modules, e gera o arquivo modules.dep.
Para remover um módulo da memória, utiliza-se o comando rmmod. modprobe -r ou rmmod -r são usados para remover uma pilha de módulos.
O usuário, através da configuração de um novo kernel, pode alterar o modo como diversos componentes são carregados: compilados junto com o kernel ou como módulos. Normalmente é recomendado fazer uso o máximo possível de módulos. Entretanto, em casos em que o componente é permanentemente necessário, pode ser mais eficiente compilá-lo junto com o kernel, ganhando em performance.
Para saber como compilar um novo kernel, consulte o How-To disponível na seção de downloads desse site.

Referência:

Understanding the Linux Kernel
Daniel P. Bovet and Marco Cesati
O’Reilly

– hlbog

No comments yet


Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>