모듈을로드 할 수 없음 : 심볼 버전 version_layout에 대해 동의하지 않음


12

이 튜토리얼 을 따라 첫 드라이버를 작성하십시오.

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

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

* 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

무슨 일이야?


명백한 의견. 먼저 커널 소스 가 Ubuntu 커널과 정확히 동일합니까? 커널과 정확히 일치 하는 Ubuntu 커널 소스를 사용해야합니다 . 배포판이 커널을 패치하기 때문에 업스트림이 작동하지 않을 수 있습니다. 둘째, 커널 헤더에 대해 컴파일 할 수 있으므로 커널 소스가 필요하지 않습니다. 헤더는 바이너리 패키지로도 사용할 수 있어야합니다. 데비안 커널 과 데비안에도 적용 할 수 있는 데비안 커널 핸드북을 살펴보십시오 .
Faheem Mitha

답변:


13

Linux 커널에는 버전마다뿐만 아니라 컴파일 옵션에 따라 레이아웃이 다른 데이터 구조가 포함됩니다. 결과적으로 커널 모듈을 컴파일 할 때 커널 소스의 헤더 파일뿐만 아니라 커널 컴파일 중에 생성 된 일부 헤더 파일도 있어야합니다. 커널 소스를 언팩하는 것만으로는 충분하지 않습니다.

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

커널 CONFIG_MODVERSIONS을 컴파일 하지 않고 빌드 한 경우 (자신의 커널을 컴파일 한 경우) 모듈을로드 할 때 확인하는 것은 간단한 버전 확인입니다. 압축을 푼 커널 소스를 가져 와서 .config실행중인 커널을 컴파일하는 동안 사용한 소스를 복사 한 후 다음 을 실행할 수 make modules_prepare있습니다. 커널에 패치를 적용해도 바이너리 호환성에 영향을 미치지 않는지 확인해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.