在内核Linux 2.4中,你可以为你的模块的“开始”和“结束”函数起任意的名字。它们不再必须使用 init_module() 和 cleanup_module() 的名字。这可以通过宏module_init() 和 module_exit() 实现。这些宏在头文件 linux/init.h 定义。唯一需要注意的地方是函数必须在宏的使用前定义,否则会有编译错误。下面就是一个例子。
Example 2-3. hello-2.c
/* hello-2.c - Demonstrating the module_init() and module_exit() macros. This is the * preferred over using init_module() and cleanup_module(). */ #include <linux/module.h> // Needed by all modules #include <linux/kernel.h> // Needed for KERN_ALERT #include <linux/init.h> // Needed for the macros static int hello_2_init(void) { printk(KERN_ALERT "Hello, world 2\n"); return 0; } static void hello_2_exit(void) { printk(KERN_ALERT "Goodbye, world 2\n"); } module_init(hello_2_init); module_exit(hello_2_exit); |
现在我们已经写过两个真正的模块了。为了提高咱们的效率,我们需要一个更强大的Makefile。下面的Makefile可以同时编译我们 的两个模块,并且同时兼顾了简洁性和扩展性。如果你有任何不理解的地方,你应该参考GNU Make的手册。
Example 2-4. 两个内核模块使用的Makefile
WARN := -W -Wall -Wstrict-prototypes -Wmissing-prototypes INCLUDE := -isystem /lib/modules/`uname -r`/build/include CFLAGS := -O2 -DMODULE -D__KERNEL__ ${WARN} ${INCLUDE} CC := gcc-3.0 OBJS := ${patsubst %.c, %.o, ${wildcard *.c}} all: ${OBJS} .PHONY: clean clean: rm -rf *.o |
作为留给读者的练习,如果我们还有一个叫 hello-3.c的模块源代码文件,我们应该如何改动Makefile来实现它的自动编译。