# Módulo carregável do núcleo

Em computação, um módulo carregável do núcleo, do inglês loadable kernel module (ou LKM), é um arquivo objeto que contém código para estender o núcleo em execução, ou o chamado núcleo base, de um sistema operacional. Os LKMs são normalmente usados para adicionar suporte para novos hardwares (como controladores de dispositivos) e/ou sistemas de arquivos, ou para adicionar chamadas de sistema. Quando a funcionalidade fornecida por um LKM não for mais necessária, ela pode ser descarregada com o objetivo de liberar memória e outros recursos.
A maioria dos sistemas tipo Unix e Microsoft Windows atuais suportam módulos carregáveis do núcleo, apesar de poderem usar um nome diferente para eles, como kernel loadable module (kld) no FreeBSD, kernel extension (kext) no OS X, kernel extension module no AIX, kernel-mode driver no Windows NT e downloadable kernel module (DKM) no VxWorks. Eles também são conhecidos como Módulos do Núcleo ou Kernel Modules (KMOD).

## Vantagens

Sem módulos carregáveis do núcleo, um sistema operacional teria de incluir todos as possíveis funcionalidades antecipadamente e já compiladas diretamente no núcleo base. Muitas dessas funcionalidades iria residir na memória sem serem utilizados, desperdiçando memória, e exigiria que os usuários reconstruíssem e reiniciassem o núcleo base toda vez que necessitassem de novas funcionalidades. A maioria dos sistemas operacionais que suportam os módulos carregáveis do núcleo incluirão módulos para suportar as funcionalidades mais desejadas.

## Desvantagens

Uma crítica menor de preferir um núcleo modular sobre um núcleo estático é a chamada penalidade de fragmentação. O núcleo base é sempre descompactado na memória contígua real por suas rotinas de configuração, desta forma, o código do núcleo base nunca é fragmentado. Uma vez que o sistema está em um estado em que os módulos podem ser inseridos, por exemplo uma vez que os sistemas de arquivos foram montados que contêm os módulos, é provável que qualquer nova inserção de código de núcleo fará com que o núcleo se torne fragmentado, introduzindo assim uma pequena penalidade de desempenho por meio do uso de mais entradas TLB, causando mais acidentes TLB.

## Descrição

Sem os módulos carregáveis do núcleo, as distribuições Linux teriam que incluir nos núcleos todos as funcionalidades possíveis, adicionando este código antecipadamente na imagem do núcleo distribuído. Esta abordagem, além de gerar grandes imagens do núcleo, faria com que o usuário tivesse que recompilar o núcleo toda vez que uma nova funcionalidade fosse necessária.

## Localização

Não há restrição técnica sobre em que local da hierarquia de arquivos os módulos devem ser colocados, porém, por convenção, eles são usualmente instalados no diretório /lib/modules/, que é dividido em subdiretórios de versões do núcleo e categorias de módulos.

## Licença

Na opinião dos mantenedores do Linux, os módulos são trabalho derivado deste núcleo. Os mantenedores toleram a distribuição de módulos proprietários mas fazem com que os símbolos sejam disponíveis apenas para os módulos que adotem a licença GPL.
Carregar um módulo proprietário irá "contaminar" o núcleo sendo executado, levando a que quaisquer problemas ou defeitos encontrados não sejam investigados pelos mantenedores. Como o módulo é parte do núcleo sendo executado, eles podem corromper estruturas de dados ou introduzir erros que não podem ser investigados devido à natureza proprietária do módulo em questão.

## Versão dos símbolos

Devido ao íntimo relacionamento entre os módulos carregáveis e o núcleo base, diferenças relativamente pequenas nas estruturas internas ou métodos podem resultar em problemas. Para mitigar este problema, inclui-se versões dos símbolos na seção .modinfo do ELF dos módulos.
A versão pode ser comparada com o núcleo sendo executado e, se incompatível, o módulo não será carregado.

## Penalidade devido a fragmentação

Uma crítica em relação a utilização dos módulos, reside no fato que a memória de um núcleo que suporta módulos carregáveis é fragmentada, ao contrário da abordagem estática (todas as funcionalidades compiladas no núcleo) em que a memória é contígua. Esta fragmentação levaria a uma pequena diminuição no desempenho do núcleo.

## Segurança

Módulos carregáveis são um modo conveniente de modificar o núcleo, o problema é que, em tese pelo menos, isto poderia ser utilizado por um usuário mal intencionado, que poderia fazer o sistema ignorar os seus processos e arquivos, permitindo que ele tomasse o controle total do sistema.