Linux内核模块编程入门-3(__init和__exit宏)

在内核2.2及以后的版本中,注意到init和cleanup函数的定义的变化,一旦init函数完成了内置的驱动,__init宏让init函数丢弃,同时释放内存,对于可加载的模块不适用。


__initdata的原理类似与__init,只是__initdata由于init变量而不是函数。


当模块从kernel中卸载时,__exit宏让函数删除。类似于__exit,对于可加载模块没有效果。


这些宏定义在/linux/init.h,用来释放内核内存,当启动内核时,看有类似“Freeing unused kernel memory:236k freed”的输出,表示内核正在释放内存。


如下示例:

/*
 * 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 hello_3_data __initdata = 3;

static int __init hello_3_init(void)
{
	printk(KERN_INFO "Hello, World %d\n", hello_3_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);


你可能感兴趣的:(Linux内核模块编程入门-3(__init和__exit宏))