Como o init determina quais dispositivos modprobe?

5

Estou criando um initramfs totalmente personalizado para um projeto de netbooting e, no processo, aprendendo muito sobre isso, mas estou um pouco intrigado com o carregamento de módulos.

Eu sei que modprobe pode ser usado para carregar módulos, mas como ele decide quais módulos carregar?

O que eu tenho agora é o initramfs inicializando e executando um shell na caixa virtual. Mas lsmod não mostra nenhum módulo carregado. O que eu preciso init fazer é carregar os módulos certos para a rede para que eu possa colocar a rede em funcionamento.

Se eu modprobe e1000 , obtenho o módulo correto carregado.

Ao analisar o processo de inicialização do Ubuntu, não consigo ver como o Ubuntu decide que ele deve carregar e1000 . Eu teria pensado que seria apenas modprobe de todos os drivers de placa de rede disponíveis, mas não parece estar fazendo isso.

Eu estou supondo que a UDEV tem algo a ver com isso?

    
por Matt H 29.04.2014 / 02:42

1 resposta

7

I know modprobe can be used to load modules, but how does it decide which modules to load?

Quando o kernel precisa de um recurso que não é residente no kernel, o daemon de módulo do kernel kmod 1 execs modprobe para carregar o módulo em. modprobe é passado uma string em uma das duas formas.

  • Um nome de módulo como softdog ou ppp.
  • Um identificador mais genérico, como char-major-10-30

Então, deixe-me explicar o que encontrei no meu sistema em vez de colar no link.

cat /proc/modules - Este comando lista quais módulos são carregados e a lista é uma lista muito grande.

Agora, durante a inicialização do sistema, como já mencionei, o daemon kmod executa o modprobe para carregar os módulos. Poderíamos especificar o módulo a ser carregado de duas maneiras, conforme já discutido. Se tivermos especificado um identificador genérico, ele procurará essa entrada em /etc/modprobe.conf para o alias. Então, no meu /etc/modprobe.conf , eu tenho um alias como abaixo.

alias eth0 tg3

Então, eu corri o comando abaixo para verificar o que é tg3 no meu sistema.

-bash-3.2$ cat /proc/modules | grep tg3
tg3 139225 0 - Live 0xf8bd1000

Em seguida, modprobe examina o arquivo /lib/modules/version/modules.dep , para ver se outros módulos devem ser carregados antes que o módulo solicitado possa ser carregado. Este arquivo é criado por depmod -a e contém dependências do módulo.

Por fim, modprobe usa insmod para primeiro carregar qualquer módulo de pré-requisito no kernel e, em seguida, o módulo solicitado. modprobe direciona insmod para /lib/modules/version/ [3], o diretório padrão para módulos. insmod pretende ser bastante burro sobre a localização dos módulos, enquanto modprobe está ciente da localização padrão dos módulos, sabe como descobrir as dependências e carregar os módulos na ordem correta.

Mas como o novo hardware é detectado?

EstesanéissãocriadospelaCPUenãopeloSO.QualquerkerneldosistemaoperacionaloperanoRing0,queéonívelmaisprivilegiadoepodesecomunicardiretamentecomohardwareeaCPU.Anéis1e2sãocomumenteusadosparadriversdedispositivo.Eoanel3éusadoparaaplicativosdeespaçodousuário(mediaplayers,servidoresdawebequalqueroutracoisacomaqualousuáriopossasecomunicardiretamente).Osdriversdedispositivossãouma“ponte”entreaplicativosehardwaredoespaçodousuário.

OkerneldoLinuxverificaconstantementetodososbusdoseucomputadorembuscadealteraçõesenovoshardwares.Quandoqualqueralteraçãoemqualquerbarramentoédetectada,amágicacomeça.

Amagia

  1. EXPORTARINFORMAÇÕESDEHARDWAREPARAUSERSPACE(SYSFS)
  2. *NOTIFICAOUSERSPACETOOLSQUEOHARDWAREESTÁDISPONÍVEL(UEVENTEUDEVD)
    • Sim,suasuposiçãoestácorreta.Oudevtemalgoavercomamágica:)*
  3. PROCESSODEUEVENTES,CORRESPONDE-OSCONTRAASREGRASEM/ETC/UDEV/RULES.D/ANDDIRETÓRIOPOPULATE/DEV(UDEVDEUDEV)
  4. CARREGADORDEDISPOSITIVOS(UDEV,MODPROBLE)
  5. NOTIFICAASAPLICAÇÕESUSERSPACE(ATRAVÉSDED-BUS)

UdevdisjustadaemonstandinginbetweentheKernelandalltheudevsystemandperformsomeimportantfunctions(I’llmentionthemlater).Theudevdaemon(udevd)isstartedatstartupthenreadsandparsesalltherulesfoundin/etc/udev/rules.d/andkeeptheserulesinmemory(udevdatabase)forfurtherusagebyudev.LaterudevdstarttolistenonthenetlinkforueventscommingfromKerneldrivercore.

Referências

por 29.04.2014 / 03:24