Não é possível carregar o módulo: discorda sobre a versão do símbolo module_layout

11

Seguindo este tutorial para escrever meu primeiro piloto.

O Makefile é:

# Makefile – makefile of our first driver

# if KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq (${KERNELRELEASE},)
    obj-m := ofd.o
# Otherwise we were called directly from the command line.
# Invoke the kernel build system.
else
    KERNEL_SOURCE := /usr/src/linux 3.8
    PWD := $(shell pwd)
default:
    ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} modules

clean:
    ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} clean
endif

E o código do driver é:

* ofd.c – Our First Driver code */
#include <linux/module.h>
#include <linux/version.h>
#include <linux/kernel.h>

static int __init ofd_init(void) /* Constructor */
{
    printk(KERN_INFO "Namaskar: ofd registered");
    return 0;
}

static void __exit ofd_exit(void) /* Destructor */
{
    printk(KERN_INFO "Alvida: ofd unregistered");
}

module_init(ofd_init);
module_exit(ofd_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Anil Kumar Pugalia <email_at_sarika-pugs_dot_com>");
MODULE_DESCRIPTION("Our First Driver");

Não há erros durante o make. Mas quando eu uso insmod ofd.ko , não consigo carregá-lo. Em dmesg , diz:

disagrees about version of symbol module_layout

  • uname -r retorna '3.8.0-38-generic' e a origem do kernel também 3.8.
  • modprobe -f ofd.ko também falha

Além disso:

#56~precise1-Ubuntu SMP Thu Mar 13 16:23:47 UTC 2014
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 12.04.4 LTS
Release:    12.04
Codename:   precise

O que está acontecendo?

    
por user2799508 20.04.2014 / 08:34

1 resposta

12

O kernel Linux contém estruturas de dados cujo layout varia não apenas de versão para versão, mas também dependendo das opções de compilação. Como conseqüência, quando você compila um módulo do kernel, você precisa ter não apenas os arquivos de cabeçalho da fonte do kernel, mas também alguns arquivos de cabeçalho que são gerados durante a compilação do kernel. Apenas descompactar a fonte do kernel não é suficiente.

Com os kernels construídos com CONFIG_MODVERSIONS , o número da versão pode diferir, mas o layout das estruturas de dados deve ser o mesmo. Esta opção está ativada nos kernels do Ubuntu. Com essa opção, além dos cabeçalhos, os módulos precisam ser compilados com o arquivo Module.symvers adequado. O Ubuntu, como a maioria das distribuições, inclui este arquivo no mesmo pacote que os cabeçalhos do kernel resultantes da compilação. O pacote de cabeçalho do kernel do Ubuntu é chamado linux-headers-VERSION-VARIANT , por ex. linux-headers-3.8.0-38-generic .

Com os kernels construídos sem o CONFIG_MODVERSIONS (o que pode ser o caso se você compilou seu próprio kernel), a verificação ao carregar um módulo é uma simples verificação de versão. Você pode pegar o código-fonte do kernel descompactado, copiar o .config que foi usado durante a compilação do seu kernel em execução e executar make modules_prepare . O ônus está em você para verificar se qualquer patch que você tenha feito no kernel não afeta a compatibilidade binária.

    
por 21.04.2014 / 00:29