O que é a sequência carregando o módulo do kernel do linux na inicialização? Como a prioridade é definida para eles?

7

Eu tenho um módulo do kernel Linux que eu compilei dinamicamente. Como é adicionado à inicialização? Há muitos arquivos .ko em /lib/modules . Como a prioridade é definida para carregar esses módulos?

    
por ganeshredcobra 10.09.2013 / 08:24

2 respostas

9

Eles não são carregados automaticamente na inicialização ou em qualquer outro momento, embora muitos deles acabem sendo carregados durante a inicialização. Existem três mecanismos diferentes pelos quais isso acontece:

  • Solicitação de espaço do usuário: Que abrange tudo, desde serviços init até o udev até a linha de comando. Init ou udev são provavelmente os meios mais diretos se você quiser carregar um módulo específico no momento da inicialização.

  • Dispositivo Hotplugged: Quando você conecta algo a, por exemplo, USB ou PCI, o kernel detecta isso e solicita um módulo apropriado com base em como o dispositivo se identifica.

  • Protocolo necessário ou outra implementação : Quando o kernel precisa fazer alguma coisa, como ler um sistema de arquivos, e descobre que falta o conhecimento para isso, ele solicitará um módulo. / p>

Observe que, para os dois últimos, usei a frase "request a module" - isso é porque o kernel é carregado por meio de um daemon userspace, kmod , que executa /sbin/modprobe . De acordo com Wolfgang Mauerer em Linux Kernel Architecture , existem apenas ~ 100 pontos diferentes no kernel 2.6 onde ele chama uma função request_module() interna.

modprobe usa um banco de dados de MODULE_ALIAS instalados. Elas são especificadas no código-fonte do módulo explicitamente ou derivadas de seu MODULE_DEVICE_TABLE, que é uma lista de IDs de dispositivo do OEM que o módulo atende.

    
por 10.09.2013 / 10:58
3

Muitos sistemas são configurados para usar um initrd ou initramfs . Estas são imagens do sistema de arquivos que são carregadas pelo carregador de inicialização e disponibilizadas ao kernel antes de montar a partição raiz. Isso permite que os drivers necessários para montar a partição raiz (drivers de disco, drivers de sistema de arquivos, mapeador de dispositivo ou drivers de volume lógico, ...) sejam compilados como módulos e carregados a partir do initrd / initramfs.

Os scripts de inicialização no initrd ( /linuxrc ) ou no initramfs ( /init ) normalmente carregam alguns módulos e localizam o sistema de arquivos raiz. Cada distribuição tem sua própria configuração. O Ubuntu usa um initramfs que é montado a partir de componentes no pacote initramfs-tools e regenerado para cada kernel com base nos drivers necessários para montar o pacote. sistema de arquivos raiz.

Após o sistema de arquivos raiz ser montado, durante a inicialização do sistema, os módulos listados em /etc/modules (Debian,…) ou /etc/modules.conf (Red Hat, Arch,…) são carregados. Este arquivo geralmente lista alguns módulos, se houver. A maioria dos módulos é carregada sob demanda.

Quando o kernel detecta algum hardware para o qual ele não tem um driver, ou certos outros componentes, como protocolos de rede ou algoritmos criptográficos, ele chama /sbin/modprobe para carregar o módulo. Para drivers de hardware, o kernel passa nomes que codificam o ID PCI, o id USB ou outra designação sistemática do hardware. Existe uma tabela em /lib/modules/$VERSION/modules.alias que mapeia essas designações sistemáticas para nomes de módulos. Esta tabela é gerada por depmod e lida por modprobe .

Se você tiver um módulo de kernel extra que você compilou manualmente para um dispositivo de hardware, solte-o em /var/lib/modules/$VERSION/local e execute depmod -a para gerar novamente o banco de dados de alias. Se o módulo for para algum recurso incomum que o kernel não consegue detectar automaticamente, solte-o em /var/lib/modules/$VERSION/local , execute depmod -a para analisar suas dependências e adicione o nome do módulo a /etc/modules .

    
por 11.09.2013 / 03:07