Библиотека сайта rus-linux.net
Hello World (part 3): The __init
and __exit
Macros
This demonstrates a feature of kernel 2.2 and later. Notice the change in the definitions of the init and cleanup
functions. The __init
macro causes the init function to be discarded and its memory freed once the init
function finishes for built-in drivers, but not loadable modules. If you think about when the init function is invoked, this
makes perfect sense.
There is also an __initdata
which works similarly to __init
but for init
variables rather than functions.
The __exit
macro causes the omission of the function when the module is built into the kernel, and
like __exit
, has no effect for loadable modules. Again, if you consider when the cleanup function runs,
this makes complete sense; built-in drivers don't need a cleanup function, while loadable modules do.
These macros are defined in linux/init.h
and serve to free up kernel memory.
When you boot your kernel and see something like Freeing unused kernel memory: 236k freed
, this is
precisely what the kernel is freeing.
Example 2-5. hello-3.c
/* * hello-3.c - Illustrating the __init, __initdata and __exit macros. */ #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 hello3_data __initdata = 3; static int __init hello_3_init(void) { printk(KERN_INFO "Hello, world %d\n", hello3_data); return 0; } static void __exit hello_3_exit(void) { printk(KERN_INFO "Goodbye, world 3\n"); } module_init(hello_3_init); module_exit(hello_3_exit);