我第一次开发自己的 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 时,我收到了“没有“默认”目标”消息。
但是,当我将 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