免费注册 查看新帖 |

Chinaunix

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

问问 __init 与 __exit 的事情 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-07-08 07:11 |只看该作者 |倒序浏览
刚才自己搜索学习了一下这两个宏定义,简单说来:
    (1) __init 与 "初始化函数" 放在一起
    (2) __exit 与 "清理函数"  放在一起

    "清理函数" 比较容易理解,当 module 以 "loadable" 的形式存在时,执行 rmmod 会执行 “清理函数”
                                         当 module 以 "built-in" 的形式存在时,"清理函数” 不会被调用
    问题一:
          "初始化函数" 的作用比较简单,就是在初始化后,free 一点内存,但是执行的时机我有些混淆
          (1) 有一些文章说,当 module 以 "build-in" 的形式存在时,才会有 "free 内存" 的动作
                                    当 module 以 "loadable" 形式存在时,不会有 "free 内存“ 的动作
          (2) 而另外一些文章说法好像相反

    问题二:
          我在网上搜索到了这样的言论,说不要在自己的函数中随便用这两个关键字。
          对于这一点,我很是好奇,因为在我们的 driver code 中,我发现有很多函数都使用了 __init 关键字,而这些函数都是自己的
          所以请大家就这个问题阐述一下.

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
2 [报告]
发表于 2010-07-08 07:54 |只看该作者
对于问题二,我理解的是“不要...随便”是针对普通函数来说的,不适用于init/exit

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
3 [报告]
发表于 2010-07-08 07:57 |只看该作者
回复 1# shi_wen_qiang


    对于问题一,LZ可以参考
http://lxr.linux.no/#linux+v2.6.34.1/include/linux/init.h
    结合GCC手册来看看

不过具体运行原理,不知道哪位能给出一个验证的方法?

论坛徽章:
0
4 [报告]
发表于 2010-07-08 10:45 |只看该作者
LZ可以试试,给一个函数标记为__init,然后取其存放地址再打印内容。

论坛徽章:
0
5 [报告]
发表于 2010-07-08 12:05 |只看该作者
我觉得如果函数只是初始化使用,以后不再调用了,可以用__init来标识

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
6 [报告]
发表于 2010-07-08 17:00 |只看该作者
回复 5# ljysyn


    对的,这是gcc的扩展,运行一次的初始化函数__init来修饰,运行完了就可以回收其内存了。

论坛徽章:
0
7 [报告]
发表于 2010-07-08 22:50 |只看该作者
(1) 有一些文章说,当 module 以 "build-in" 的形式存在时,才会有 "free 内存" 的动作
                                    当 module 以 "loadable" 形式存在时,不会有 "free 内存“ 的动作

这个说法是对的.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP