モジュールをロードできません:シンボルmodule_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カーネルソースを使用する必要があります。ディストリビューションはカーネルにパッチを当てているため、上流はおそらく機能しません。次に、カーネルヘッダーに対してコンパイルできるので、カーネルソースは必要ありません。ヘッダーは、バイナリパッケージとしても利用できる必要があります。また、Ubuntuにも適用されるDebianのカーネルなどに関する有益な情報が記載されているDebianカーネルハンドブックもご覧ください。
Faheem Mitha、

回答:


13

Linuxカーネルには、バージョンごとにレイアウトが異なるだけでなく、コンパイルオプションによっても異なるデータ構造が含まれています。その結果、カーネルモジュールをコンパイルするときは、カーネルソースからのヘッダーファイルだけでなく、カーネルのコンパイル中に生成されるいくつかのヘッダーファイルも必要です。カーネルソースを解凍するだけでは不十分です。

で構築されたカーネルではCONFIG_MODVERSIONS、バージョン番号が異なる場合がありますが、データ構造のレイアウトは同じでなければなりません。このオプションは、Ubuntuカーネルでアクティブ化されます。このオプションでは、ヘッダーに加えて、モジュールを適切なModule.symversファイルに対してコンパイルする必要があります。Ubuntuは、ほとんどのディストリビューションと同様に、このファイルを、コンパイル結果のカーネルヘッダーと同じパッケージに含めます。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.