Os módulos do driver são carregados e descarregados automaticamente?

11

No Ubuntu 14.04, descobri que quando não conecto meu adaptador sem fio externo, seu módulo rt2800usb ainda é mostrado em lsmod .

  1. quando o carregamento automático de um módulo de driver acontece? É quando o dispositivo está conectado ao computador ou quando o SO é inicializado?

  2. quando ocorre o descarregamento automático de um módulo de driver? É quando o dispositivo é desconectado do computador ou quando o SO é desligado?

por Tim 21.04.2015 / 19:14

2 respostas

11

Quando o kernel detecta um novo dispositivo, ele executa o programa modprobe e passa um nome para ele identifica o dispositivo. A maioria dos dispositivos é identificada através de números registrados para um fornecedor e modelo, por ex. PCI ou USB identificadores. O programa modprobe consulta a tabela de alias do módulo /lib/modules/VERSION/modules.alias para encontrar o nome do arquivo que contém o driver para esse dispositivo em particular. Um princípio semelhante se aplica a drivers para coisas que não são dispositivos de hardware, como sistemas de arquivos e algoritmos criptográficos. Para mais detalhes, veja O Debian não detectar placa PCI serial após a reinicialização

Uma vez que a modprobe identificou qual arquivo de módulo ( .ko ) contém o driver solicitado, ele carrega o arquivo do módulo no kernel: o código do módulo é dinamicamente carregado no kernel. Se o módulo for carregado com sucesso, ele aparecerá na listagem de lsmod .

O carregamento automático de módulos acontece quando o kernel detecta um novo hardware hotpluggable, por ex. quando você conecta um periférico USB. O sistema operacional também faz um passo de enumerar todo o hardware que está presente no sistema mais cedo durante a inicialização, a fim de carregar os drivers dos periféricos que estão presentes no momento da inicialização.

Também é possível solicitar manualmente o carregamento de um módulo com o comando modprobe ou insmod . A maioria das distribuições inclui um script de inicialização que carrega os módulos listados em /etc/modules . Outra maneira de carregar os módulos é se eles são uma dependência de um módulo: se o módulo A depende do módulo B, então modprobe A carrega B antes de carregar A.

Quando um módulo é carregado, ele permanece carregado até ser descarregado explicitamente, mesmo que todos os dispositivos que usam esse driver tenham sido desconectados. Há muito tempo atrás, havia um mecanismo para descarregar automaticamente módulos não utilizados, mas foi removido, se bem me lembro, quando o udev entrou em cena. Eu suspeito que o descarregamento automático de módulos não é um recurso comum, porque os sistemas que tendem a precisar são principalmente desktops que têm muita memória de qualquer maneira (na escala do código do driver).

    
por 22.04.2015 / 03:34
5

Os módulos são carregados quando o sistema é inicializado por meio do Disco RAM inicial a.k.a o initrd . A seção Justificativa declara:

Many Linux distributions ship a single, generic Linux kernel image – one that the distribution's developers create specifically to boot on a wide variety of hardware. The device drivers for this generic kernel image are included as loadable kernel modules because statically compiling many drivers into one kernel causes the kernel image to be much larger, perhaps too large to boot on computers with limited memory. This then raises the problem of detecting and loading the modules necessary to mount the root file system at boot time, or for that matter, deducing where or what the root file system is.

O Ubuntu, como muitas outras distribuições, escolhe carregar cada driver de dispositivo nesse initrd, independentemente de o driver ser necessário ou não, e também se o dispositivo estiver presente no sistema ou não. Como Giles apontou, a coisa toda é carregada na RAM e, em seguida, os módulos usados são detectados na inicialização e os não utilizados são removidos da RAM. Usar essa abordagem garante que o Ubuntu sempre comece em qualquer sistema, independentemente da configuração. O Ubuntu está imitando um kernel monolítico usando construções microkernel. Veja A razão pela qual isso funciona

  1. O módulo rt2800usb será sempre carregado na inicialização porque o módulo foi incluído no initramfs ao qual Gilles se referiu . O initramfs é um sucessor do initrd, portanto, ele sempre será mostrado por lsmod . Note que você pode inserir um módulo recém-compilado no kernel usando modprobe seguido pelo nome do módulo.

Como teste, reinicie o sistema com o adaptador sem fio desconectado. Se tudo correr bem, o módulo não será listado na saída lsmod s porque, durante a inicialização, o processo de detecção foi iniciado pelo initramfs e o sistema init não localizou o dispositivo durante a análise, e o módulo foi removido da RAM.

  1. Para remover um módulo enquanto um sistema está em execução, você pode usar comandos como rmmod ou modprobe -r seguido pelo nome do módulo. Na próxima inicialização, o módulo será recarregado. Veja acima. Na maioria dos casos, um módulo não é removido dinamicamente, pois isso desabilitaria o hotplugging, ou seja, uma vez que um módulo é removido, o dispositivo que o utiliza não pode ser detectado novamente quando é reconfigurado.

Para remover um módulo de lsmod , você deve removê-lo da imagem initramfs criada recompilando o kernel sem o módulo escolhido e, em seguida, recriando a imagem. Isso desativa todas as detecções do módulo.

    
por 21.04.2015 / 20:55