私自身のnetfilterモジュールを開発するのは今回が初めてです。インターネット文書によると、最も単純なモジュールには次のCコードが含まれています。
//'Hello World' kernel module, logs call to init_module
// and cleanup_module to /var/log/messages
// In Ubuntu 8.04 we use make and appropriate Makefile to compile kernel module
#define __KERNEL__
#define MODULE
#include <linux/module.h>
#include <linux/kernel.h>
int init_module(void)
{
printk(KERN_INFO "init_module() called\n");
return 0;
}
void cleanup_module(void)
{
printk(KERN_INFO "cleanup_module() called\n");
}
同じページでは、makefile に対して以下を提案します。
obj-m := hello.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
コマンドラインから make を実行すると、「No "default" target」というメッセージが表示されます。
しかし、makefileを次のように変更した場合:
obj-m := hello.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コンパイラが実際に実行され、モジュールの挿入と削除が期待どおりに動作します。
気になりました。私が示した最後のmakefileは、すべてのUNIXオペレーティングシステム(バージョン2.24以降)と互換性がありますか?現在私はSlackware 12 32ビットを使用しており、CentOS 6 64ビットでもコードをテストする予定です。生成できる汎用makefileがある場合は、それを実行してから、システムごとに別々のmakefileを作成することをお勧めします。
誰でも私にアドバイスを与えることができますか?
答え1
AFAIK、よさそうですね。私が使用するデフォルト値は小さいその他。それから来るLinuxデバイスドライバのドキュメント
# To build modules outside of the kernel tree, we run "make"
# in the kernel source tree; the Makefile these then includes this
# Makefile once again.
# This conditional selects whether we are being included from the
# kernel Makefile or not.
ifeq ($(KERNELRELEASE),)
# Assume the source tree is where the running kernel was built
# You should set KERNELDIR in the environment if it's elsewhere
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
# The current directory is passed to sub-makes as argument
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.order *.symvers
.PHONY: modules modules_install clean
else
# called from kernel build system: just declare what our modules are
obj-m := hello.o
endif