免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 902 | 回复: 6
打印 上一主题 下一主题

关于__init和__exit,谁能解释清楚? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-28 18:33 |只看该作者 |倒序浏览
请问各路大侠,在linux的驱动编程里面经常能看到这样的代码
static __init XXXinit(void);
static __exit  XXXX_exit(void);
不知这里的__init和__exit到底是哪里来的,是编译器自带的,还是linux内核的里面定义一个宏呢,如果不加__init和__exit这样的前缀,可以吗?为什么呢?

请高手指点,问了旁边的同事,都是只知道这别人这样用,就这样用,不知到为什么要这样用。

论坛徽章:
0
2 [报告]
发表于 2006-04-29 10:11 |只看该作者
>还是linux内核的里面定义一个宏呢
是这个。它是用了gcc提供的__attribute__语法。 加了更安全, 这样__init的函数就会被放在二进制ELF模块文件的.init.text section, 保证在插入模块的时候这些函数就会被调用;__exit道理一样,把插入改成卸载就一样了。

论坛徽章:
0
3 [报告]
发表于 2006-04-29 10:46 |只看该作者
好象,__init 修饰不是为了保证插入模块时会被调用的。module_init()修饰是。

也就是是说__init函数不是一定会被调用。

__init是为了函数的空间在收回时可以被回收。

论坛徽章:
0
4 [报告]
发表于 2006-04-29 10:51 |只看该作者
版主,好厉害。什么时候能不能介绍一下关于elf文件格式的文章。谢谢。

论坛徽章:
0
5 [报告]
发表于 2006-04-29 11:17 |只看该作者
原帖由 思一克 于 2006-4-29 10:46 发表
好象,__init 修饰不是为了保证插入模块时会被调用的。module_init()修饰是。

也就是是说__init函数不是一定会被调用。

__init是为了函数的空间在收回时可以被回收。


思兄说的是,我搞混了;看了一下include/linux/init.h中的注释:

1)对 __init的:
* These macros are used to mark some functions or
* initialized data (doesn't apply to uninitialized data)
* as `initialization' functions. The kernel can take this
* as hint that the function is used only during the initialization
* phase and free up used memory resources after


2)对module_init的:
* module_init() - driver initialization entry point
* @x: function to be run at kernel boot time or module insertion
*
* module_init() will either be called during do_initcalls (if
* builtin) or at module insertion time (if a module).  There can only
* be one per module.

论坛徽章:
0
6 [报告]
发表于 2006-04-29 12:08 |只看该作者
to alb,

其实我也不是记的很清楚

论坛徽章:
0
7 [报告]
发表于 2006-04-29 13:15 |只看该作者
非常感谢大家的帮助,我找到那个头文件,仔细看了这个宏。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP