3

Linuxカーネルモジュールの学習を開始し、単純なHello worldプログラムを作成しようとしています.

したがって、mymod.c:

#include <linux/module.h>
#include <linux/kernel.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Author");
MODULE_DESCRIPTION("\"Hello, world!\" minimal module");
MODULE_VERSION("printk");

int init_module(void)
{
    printk("<1>Hello world 1.\n");
    return 0;
} 

void cleanup_module(void)
{
    printk(KERN_ALERT "Goodbye world 1.\n");
}

メイクファイル:

obj-m += mymod.o 
all:
     make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 
clean: 
     make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

アウトアウト:

make -C /lib/modules/3.2.0-23-generic-pae/build M=/root modules
make[1]: Entering directory `/usr/src/linux-3.2.42'

  WARNING: Symbol version dump /usr/src/linux-3.2.42/Module.symvers
           is missing; modules will have no dependencies and modversions.

  Building modules, stage 2.
  MODPOST 1 modules
make[1]: Leaving directory `/usr/src/linux-3.2.42'

したがって、必要なファイルが作成されますが、これをインストールしようとすると

insmod mymod.ko

次の出力が得られます。

insmod: error inserting 'mymod.ko': -1 Invalid module format

それで、何が問題なのか知りたいですか?

PS。OS - Ubuntu サーバー 12.04。カーネル - Linux 3.2.0-23 pae

アップデート:

kernel.org からカーネル 3.2.42 をダウンロードして /usr/src に置き、「make defconfig && make prepare」、「make modules_prepare」を実行しました。また、/lib/modules/3.2.0-23-generic-pae/build にリンクを作成しました。

4

3 に答える 3

2

これは実行中のカーネルのソース ツリーですか? そうでない場合は、失敗するはずです。

ディストリビューション用の kernel-devel (または同様の名前の) パッケージをインストールすると、モジュールをビルドするのに十分な機構が追加されます。

于 2013-03-30T13:02:48.413 に答える
1

module_initandmodule_cleanup宣言を見逃しました。

module_init (module_init);
module_exit (cleanup_module);

そうしないと、エントリ ポイントが定義されず、読み込まれません。

于 2013-03-31T00:58:01.713 に答える