모듈을 로드할 수 없습니다: module_layout 기호 버전에 동의하지 않습니다.

모듈을 로드할 수 없습니다: module_layout 기호 버전에 동의하지 않습니다.

다음과 같은이 튜토리얼첫 번째 드라이버를 작성 중입니다.

생성된 파일은 다음과 같습니다.

# 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

드라이버 코드는 다음과 같습니다.

* 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");

제작시 실수는 없습니다. 하지만 사용할 때 로드할 수 없습니다 insmod ofd.ko. 내용 dmesg은 다음과 같습니다:

module_layout 기호의 버전에 대해서는 다양한 의견이 있습니다.

  • uname -r"3.8.0-38-generic"을 반환하며 커널 소스도 3.8입니다.
  • modprobe -f ofd.ko역시 실패했다

반품:

#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

뭐가 문제 야?

답변1

Linux 커널에 포함된 데이터 구조의 레이아웃은 버전마다 다를 뿐만 아니라 컴파일 옵션에도 따라 다릅니다. 따라서 커널 모듈을 컴파일할 때는 커널 소스 코드의 헤더 파일뿐만 아니라 커널 컴파일 중에 생성된 일부 헤더 파일도 필요합니다. 단순히 커널 소스 코드를 푸는 것만으로는 충분하지 않습니다.

로 빌드된 커널의 경우 CONFIG_MODVERSIONS버전 번호는 다를 수 있지만 데이터 구조의 레이아웃은 동일해야 합니다. 이 옵션은 Ubuntu 커널에서 활성화됩니다. 이 옵션을 사용하면 헤더 외에도 올바른 Module.symvers파일에 대해 모듈을 컴파일해야 합니다. 대부분의 배포판과 마찬가지로 Ubuntu에는 컴파일된 커널 헤더와 동일한 패키지에 이 파일이 포함되어 있습니다. 예를 들어 Ubuntu 커널 헤더 패키지의 이름이 지정됩니다.linux-headers-VERSION-VARIANTlinux-headers-3.8.0-38-generic

빌드되지 않은 커널의 경우 CONFIG_MODVERSIONS(자신의 커널을 컴파일한 경우일 수 있음) 모듈을 로드할 때 확인하는 것은 간단한 버전 확인입니다. 압축이 풀린 커널 소스 코드를 얻고 .config실행 중인 커널을 컴파일하는 동안 사용된 커널 소스 코드를 복사한 다음 를 실행할 수 있습니다 make modules_prepare. 커널에 적용된 패치가 바이너리 호환성에 영향을 주지 않는지 확인하는 것은 사용자의 책임입니다.

관련 정보