내 자신의 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