私は簡単なモジュールを書きました:
#define __KERNEL__
#define MODULE
#include <linux/kernel.h>
#include <linux/module.h>
int init_module(void)
{
printk("Hello, world\n");
return 0;
}
void cleanup_module(void)
{
printk("Goodbye\n");
}
次のコマンドでコンパイルします:
cc -c hello.c
しかし、私はこのエラーを受け取っています:
linux/module.h: No such file or directory
助言がありますか?
編集:私はこれをコンマで使用しました:
cc -I/usr/src/linux-headers-3.0.0-17-generic/include -c hello.c
そしてそれは一歩先に進みます、今私はこのエラーを受け取ります:
In file included from /usr/src/linux-headers-3.0.0-17-generic/include/linux/kernel.h:13:0,
from hello.c:3:
/usr/src/linux-headers-3.0.0-17-generic/include/linux/linkage.h:5:25: fatal error: asm/linkage.h: No such file or directory
compilation terminated.
ソースファイル名はbasic.cです
#include <linux/init.h>
#include <linux/module.h>
/*MODULE_LICENSE("Dual BSD/GPL");*/
static int hello_init(void)
{
printk(KERN_ALERT "Hello, world\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);
=====================================
最初にur端末で$(uname -r)と入力すると、uはバージョンを取得します。urシステムで使用しているバージョンです。
obj-m +=basic.o
KDIR =//usr/src/linux-headers-3.13.0-44-generic
all:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
rm -rf *.o *.ko *.mod.* *.symvers *.order
================================================
$Sudo insmod basic.ko
$dmesg
u will get the output
$Sudo rmmod basic.ko
$dmesg
カーネルヘッダーが必要です。インストールされている場合、それらは通常/usr/include/
にあります。
ソースベースのディストリビューションを使用しているか、独自のカーネルを構築していない限り、デフォルトではインストールされません。それらをインストールするには、ディストリビューションのパッケージマネージャーを使用します。パッケージはしばしばlinux-headers
と呼ばれます。
カーネルビルド環境(スクリプト、ヘッダー、Makefileの選択)が必要です。カーネルが既にインストールされている場合は、通常、/ lib/modules/version/build(それにシンボリックリンク)でアクセスできます。それ以外の場合、ディレクトリはビルドディレクトリ(System.mapがあるディレクトリ)です。完全なソースはnotが必要であり(スマートディストリビューションはこれを認識します)、どちらも/ usr/include/whateverではありません。
あなたも必須 kbuildを使用します。 cc -I
を呼び出すだけでは不十分で、10年以上経っていません。 Kbuild
ファイルから始めます。
obj-m += mymodule.o
とMakefile
:
kdir=/lib/modules/$(Shell uname -r)/build
all:
make -C ${kdir} M=$$PWD
modules_install clean:
make -C ${kdir} M=$$PWD $@
次にmake
を利用します。
#defining __KERNEL__
およびMODULE
も無意味です。これは、必要に応じてkbuildによってすでに設定されているためです。
ほとんどのLinuxディストリビューションは、デフォルトでカーネルヘッダーをインストールしません。カーネルヘッダーなどのパッケージを探します。