モジュールを読み込めません: 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。カーネルに適用されたパッチがバイナリ互換性に影響しないことを確認するのはユーザーの責任です。

関連情報