A carga de módulos do kernel que foram compilados para outro kernel falhou

2

Eu quero carregar os módulos do kernel, ip_gre.ko e gre.ko , em um dispositivo incorporado executando o embedded-linux para fazer com que esse dispositivo suporte o protocolo GRE. Como eu não quero mudar o kernel do dispositivo Embedded-linux, eu tento carregar módulos do kernel ao invés de reinstalar o kernel do dispositivo.

Felizmente, eu tenho o código-fonte do kernel desse dispositivo, portanto, eu poderia compilar os módulos ip_gre.ko e gre.ko . No entanto, o carregamento de módulos usando insmod no dispositivo falhou com as seguintes mensagens:

$ insmod gre.ko
insmod: can't insert 'gre.ko': Resource temporarily unavailable
$ insmod ip_gre.ko
ip_gre: Unknown symbol gre_del_protocol
ip_gre: Unknown symbol gre_add_protocol
insmod: can't insert 'ip_gre.ko': unknown symbol in module, or unknown parameter
$ dmesg
GRE over IPv4 demultiplexor drvier
gre: can't add protocol
ip_gre: Unknown symbol gre_del_protocol
ip_gre: Unknown symbol gre_add_protocol

Meu dispositivo tem memeory suficiente para carregar os módulos ( free mostrou que 190700/239760 são gratuitos).

Você poderia, por favor, me avisar por que isso acontece e suas possíveis soluções?

ATUALIZAÇÃO:

Estas são diferenças entre .config do kernel em execução (no dispositivo) e do kernel compilado para os dois módulos acima.

$ diff config_for_running_kernel config_for_kernel_compiled_for_modules
299c299, 301
< # CONFIG_NET_IPGRE_DEMUX is not set
---
> CONFIG_NET_IPGRE_DEMUX=m
> CONFIG_NET_IPGRE=m
> CONFIG_NET_IPGRE_BROADCAST=y
963c965
< CONFIG_PPTP=y
---
> CONFIG_PPTP=m

Como CONFIG_PPTP depende de CONFIG_NET_IPGRE_DEMUX , eu tive que fazer isso como um módulo para compilar o kernel sem uma mensagem de erro.

As diferenças causam mensagens de erro acima? Se for, você poderia me dizer como posso resolvê-lo ...? (e se você tiver referências adicionais que possam me ensinar sobre esses problemas e soluções, eu ficaria muito grato)

    
por kolar 12.03.2015 / 08:44

1 resposta

1

Eu resolvi o problema analisando & modificando o módulo do kernel. Analisar o código fonte do módulo do kernel indica que as opções de kernel compatíveis devem estar relacionadas para carregar os módulos do kernel, como comentou Gilles. O carregamento do módulo do kernel gre causou o problema porque o módulo pptp existente usa o ID de protocolo IPGRE_PROTO que é igual a gre ID do protocolo. O kernel sem gre module enabled usa IPGRE_PROTO como pptp ID do protocolo.

    
por 18.03.2015 / 05:48