2.3. Hello World (part 2)

在内核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来实现它的自动编译。