A maneira como isso funciona normalmente é:
- O código-fonte do módulo contém chamadas para o
MODULE_DEVICE_TABLE
macro para declarar uma tabela de identificadores de dispositivo que este módulo suporta. - No módulo compilado, os aliases são armazenados como valores de símbolos chamados
__mod_alias_NNN
, em que o NNN é inteiro. O valor codifica a identificação de barramento para o dispositivo, por ex.pci:v00009710d00009865sv*sd*bc*sc*i*
para o dispositivo PCI identificado como fornecedor 0x9710 , dispositivo 0x9865.
também são armazenados sob o nome__mod_pci_device_table
para dispositivos PCI,__mod_usb_device_table
para dispositivos USB, etc. - O programa
depmod
cria um mapeamento da tabela de alias__mod_alias_NNN
values para o nome do módulo. Esta tabela é armazenada no arquivomodules.alias
na raiz do diretório de módulos do kernel, por exemplo./lib/modules/2.6.32-5-amd64/modules.alias
.
Também cria arquivos comomodules.pcimap
,modules.usbmap
,…, que são usados pela infraestrutura de hotplug obsoleta que foi incluída novamente no modprobe. - Quando o kernel detecta um dispositivo para o qual nenhum driver está presente, ele tenta carregar um módulo chamando o programa indicado pelo
kernel.modprobe
sysctl , que é/sbin/modprobe
por padrão. O kernel passa um argumento paramodprobe
que indica qual driver é solicitado. Para um dispositivo PCI, esse é um nome comopci:v00009710d00009865sv*sd*bc*sc*i*
. -
modprobe
procura por um módulo com o nome dado. Se encontrar um módulo com o nome solicitado (depois de seguir o alias definido em seus arquivos de configuração, que incluem/etc/modprobe.d/*.conf
e/lib/modules/$(uname -r)/modules.alias
), ele carrega esse módulo.
modprobe
não carregará um módulo que foi na lista negra de uma diretivablacklist
em seus arquivos de configuração.
Execute lspci -n
para ver os IDs PCI do seu dispositivo e verifique a cadeia acima para ver onde algo deu errado.
Às vezes, um driver funciona para um dispositivo que é muito semelhante ao dispositivo para o qual ele é destinado, mas tem um ID de PCI diferente. Nesse caso, é possível que o driver funcione, mas não será carregado automaticamente porque não declara o ID do PCI para o seu dispositivo. Você pode adicionar o alias manualmente em /etc/modprobe/my_aliases.conf
.
Você pode forçar um módulo a ser carregado automaticamente no momento da inicialização, adicionando seu nome a /etc/modules
.