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:
– hlbog