2.3. Hello World
(part 2)
As of Linux 2.4, you can rename the init and cleanup functions
of your modules; they no longer have to be called init_module() and cleanup_module() respectively. This is done with
the module_init() and module_exit() macros. These macros are defined in
linux/init.h. The only caveat is that
your init and cleanup functions must be defined before calling the
macros, otherwise you'll get compilation errors. Here's an example
of this technique:
Example 2-3. hello-2.c
/*
* hello-2.c - Demonstrating the module_init() and module_exit() macros.
* This is preferred over using init_module() and cleanup_module().
*/
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
#include <linux/init.h> /* Needed for the macros */
static int __init hello_2_init(void)
{
printk(KERN_INFO "Hello, world 2\n");
return 0;
}
static void __exit hello_2_exit(void)
{
printk(KERN_INFO "Goodbye, world 2\n");
}
module_init(hello_2_init);
module_exit(hello_2_exit);
|
So now we have two real kernel modules under our belt. Adding
another module is as simple as this:
Example 2-4. Makefile for both our modules
obj-m += hello-1.o
obj-m += hello-2.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
|
Now have a look at linux/drivers/char/Makefile for a real world
example. As you can see, some things get hardwired into the kernel
(obj-y) but where are all those obj-m gone? Those familiar with
shell scripts will easily be able to spot them. For those not, the
obj-$(CONFIG_FOO) entries you see everywhere expand into obj-y or
obj-m, depending on whether the CONFIG_FOO variable has been set to
y or m. While we are at it, those were exactly the kind of
variables that you have set in the linux/.config file, the last time when you said
make menuconfig or something like that.