Linux内核模块-The__init and __exit宏(三)
2014-04-06 19:54
393 查看
1.先看程序的头文件(参考hello.c)
# include <linux/module.h> /* Need by all modules */
# include <linux/kernel.h> /* Need for HERN_INFO */
# include <linux/init.h> /* Need for the macros */
这三个头文件是编写内核模块程序必须的。
由于内核编程和用户编程所用的库函数不一样,所以他的头文件也和我们在用户层编写程序时所用的头文件不 一样。
Linux中头文件存放位置:
a.内核头文件的位置:/usr/src/linux-2.6.x/include
b.用户层头文件位置:/usr/include
2.内核模块的(加/卸载)函数:
加载函数:
static int hello_init(void) //不加void在调试时会出现警报
{
printk(KERN_INFO "Hello world\n");
/*
A non 0 return means init
*/
return 0;
}
卸载函数(无返回值):
static void hello_exit(void)
{
printk(KERN_INFO "Goodbye world\n");
}
3.对比hello.c中的(加/卸载)函数
# include <linux/init.h> /* Need for the macros */
static int __init hello_init(void)
{
printk(KERN_INFO "Hello world\n");
/*
A non 0 return means init
*/
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_INFO "Goodbye world\n");
}
注解:通过比较我们发现第二种函数在函数名称前加了__init和__exit前缀(init 和 exit 前面都是两个下划线)。
那么第二种方法比第一种有什么好处呢?
_init 和 __exit 是 Linux 内核的一个宏定义,使系统在初始化完成后释放该函数,并释放其所占内存。因此它的优点是显而易见的。所以建议大家啊在编写入口函数和出口函数时采用第二中方法。
(1) 在 linux 内核中,所有标示为 __init 的函数在连接的时候都放在 .init.text 这个区段内,此外,所有的 __init 函数在区段 .initcall.init 中还保存了一份函数指针,在初始化时内核会通过这些函数指针调用这些 __init 函数,并在初始化完成后释放 init 区段(包括 .init.text,.initcall.init等)。
(2) 和 __init 一样, __exit 也可以使对应函数在运行完成后自动回收内存。
相关链接:http://blog.csdn.net/tigerjibo/article/details/6010997
# include <linux/module.h> /* Need by all modules */
# include <linux/kernel.h> /* Need for HERN_INFO */
# include <linux/init.h> /* Need for the macros */
这三个头文件是编写内核模块程序必须的。
由于内核编程和用户编程所用的库函数不一样,所以他的头文件也和我们在用户层编写程序时所用的头文件不 一样。
Linux中头文件存放位置:
a.内核头文件的位置:/usr/src/linux-2.6.x/include
b.用户层头文件位置:/usr/include
2.内核模块的(加/卸载)函数:
加载函数:
static int hello_init(void) //不加void在调试时会出现警报
{
printk(KERN_INFO "Hello world\n");
/*
A non 0 return means init
*/
return 0;
}
卸载函数(无返回值):
static void hello_exit(void)
{
printk(KERN_INFO "Goodbye world\n");
}
3.对比hello.c中的(加/卸载)函数
# include <linux/init.h> /* Need for the macros */
static int __init hello_init(void)
{
printk(KERN_INFO "Hello world\n");
/*
A non 0 return means init
*/
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_INFO "Goodbye world\n");
}
注解:通过比较我们发现第二种函数在函数名称前加了__init和__exit前缀(init 和 exit 前面都是两个下划线)。
那么第二种方法比第一种有什么好处呢?
_init 和 __exit 是 Linux 内核的一个宏定义,使系统在初始化完成后释放该函数,并释放其所占内存。因此它的优点是显而易见的。所以建议大家啊在编写入口函数和出口函数时采用第二中方法。
(1) 在 linux 内核中,所有标示为 __init 的函数在连接的时候都放在 .init.text 这个区段内,此外,所有的 __init 函数在区段 .initcall.init 中还保存了一份函数指针,在初始化时内核会通过这些函数指针调用这些 __init 函数,并在初始化完成后释放 init 区段(包括 .init.text,.initcall.init等)。
(2) 和 __init 一样, __exit 也可以使对应函数在运行完成后自动回收内存。
相关链接:http://blog.csdn.net/tigerjibo/article/details/6010997
相关文章推荐
- What is the difference between Constructor and ngOnInit?
- Git Init repository for remote terminal and change the remote master
- What is the difference between initWithCoder:, initWithNibName:, and awakeFromNib?
- What is the difference between initWithCoder:, initWithNibName:, and awakeFromNib?
- The init process and init.rc
- Home not found. Define system property "openfireHome" or create and add the openfire_init.xml file to the classpath
- What are the __init* and __exit* macros ?
- The difference between Python __init__ and __new__
- Linux内核模块编程入门-3(__init和__exit宏)
- 2.4. Hello World (part 3): The __init and __exit Macros
- Q: #6 Is the Feature Builder Preview supported on Windows XP and Windows Server 2003?
- The Machine SID Duplication Myth (and Why Sysprep Matters)
- The Agile Manifesto and Principles
- Preparing and Submitting an Application to the App Store with xCode4.2 and iOS5 SDK
- Login failed. The login is from an untrusted domain and cannot be used with Windows authentication.
- The confusion about jsp four scopes and ServletContext,HttpSession,HttpServletReqest,PageContext
- How to Create the CAPL DLL and integrated it into CANOE
- The connection to adb is down, and a severe error has occured.
- [整数分解+dfs] light oj 1341 Aladdin and the Flying Carpet