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.