免费注册 查看新帖 |

Chinaunix

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

请教:内核代码中出现的__init等宏 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-09-09 11:37 |只看该作者 |倒序浏览
我在看驱动程序时,发现有的函数的前面有__init,
我上网去查了下,说是宏,是编译时会将被修饰的内容放到这些宏所代表的section中,
可是我记得在linux中的section,主要是text,data和bss,好像没有这些init的section,
我在网上看到什么有7个级别的init,我看了不太明白,哪位能说说吗?或者能否提供资料?
另:__init这个宏好像不能在用户级别的应用程序中使用,是吗?(我在helloworld中
使用,编译就不能通过,我已经加了<linux/init.h>头文件)

论坛徽章:
0
2 [报告]
发表于 2013-09-10 10:22 |只看该作者
#define __init          __attribute__ ((__section__ (".init.text")))
这个写的不是很清楚吗
通常编译器将函数放在.text 节,变量放在.data 或 .bss 节,使用 section 属性,可以让
编译器将函数或变量放在指定的节中。那么前面对__init 的定义便表示将它修饰的代码放
在.init.text节。
__init 修饰的所有代码都会被放在.init.text节里,初始化结束后就可以释放这部分内存。
7个级 linux-2.6.10  arch/arm/kernel/vmlinux.lds.S
                __initcall_start = .;
                        *(.initcall1.init)
                        *(.initcall2.init)
                        *(.initcall3.init)
                        *(.initcall4.init)
                        *(.initcall5.init)
                        *(.initcall6.init)
                        *(.initcall7.init)
7等级已是过去式

linux-3.2.36  14等级
arch/arm/kernel/vmlinux.lds
  __initcall_start = .;
*(.initcallearly.init) __early_initcall_end = .;
*(.initcall0.init) *(.initcall0s.init) *(.initcall1.init) *(.initcall1s.init) *(.initcall2.init) *(.initcall2s.init) *(.initcall3.init) *(.initcall3s.init) *(.initcall4.init) *(.initcall4s.init) *(.initcall5.init) *(.initcall5s.init) *(.initcallrootfs.init) *(.initcall6.init) *(.initcall6s.init) *(.initcall7.init) *(.initcall7s.init) __initcall_end = .;

#define pure_initcall(fn)               __define_initcall("0",fn,0)

#define core_initcall(fn)               __define_initcall("1",fn,1)
#define core_initcall_sync(fn)          __define_initcall("1s",fn,1s)
#define postcore_initcall(fn)           __define_initcall("2",fn,2)
#define postcore_initcall_sync(fn)      __define_initcall("2s",fn,2s)
#define arch_initcall(fn)               __define_initcall("3",fn,3)
#define arch_initcall_sync(fn)          __define_initcall("3s",fn,3s)
#define subsys_initcall(fn)             __define_initcall("4",fn,4)
#define subsys_initcall_sync(fn)        __define_initcall("4s",fn,4s)
#define fs_initcall(fn)                 __define_initcall("5",fn,5)
#define fs_initcall_sync(fn)            __define_initcall("5s",fn,5s)
#define rootfs_initcall(fn)             __define_initcall("rootfs",fn,rootfs)
#define device_initcall(fn)             __define_initcall("6",fn,6)
#define device_initcall_sync(fn)        __define_initcall("6s",fn,6s)
#define late_initcall(fn)               __define_initcall("7",fn,7)
#define late_initcall_sync(fn)          __define_initcall("7s",fn,7s)

,这14个宏有优先级:0>0s>1>1s>2>2s………>7>7s
启动也按这个顺序执行,提示一下 这个内核启动是执行和上面的__init初始化执行不是一个东西。
大概就这样
好久没贴小广告:
linux驱动群: 163617970

论坛徽章:
0
3 [报告]
发表于 2013-09-11 15:19 |只看该作者
__init 修饰的所有代码都会被放在.init.text节里,初始化结束后就可以释放这部分内存。
------------------------------------------------------------
那么是不是表示.init.text是被包含在.text节里的?也就是说.text包含.init.text?



论坛徽章:
0
4 [报告]
发表于 2013-09-12 09:22 |只看该作者
回复 3# netdoger
你写的
linux中的section,主要是text,data和bss,好像没有这些init的section。
下面是源码
         * SECTIONS
         * {
         *      . = START;
         *      __init_begin = .;//这个不就是init,为什么你写“好像没有这些init的section”
         *      HEAD_TEXT_SECTION
         *      INIT_TEXT_SECTION(PAGE_SIZE)
         *      INIT_DATA_SECTION(...)
         *      PERCPU_SECTION(CACHELINE_SIZE)
         *      __init_end = .;
         *
         *      _stext = .;
         *      TEXT_SECTION = 0
         *      _etext = .;
         *
         *      _sdata = .;
         *      RO_DATA_SECTION(PAGE_SIZE)
         *      RW_DATA_SECTION(...)
         *      _edata = .;
         *
         *      EXCEPTION_TABLE(...)
         *      NOTES
         *
         *      BSS_SECTION(0, 0, 0)
         *      _end = .;
         *
         *      STABS_DEBUG
         *      DWARF_DEBUG
         *
         *      DISCARDS                // must be the last
         * }

然后
         __init_begin = .;
         . = ALIGN(; .init.text : AT(ADDR(.init.text) - 0) { _sinittext = .; *(.init.text) *(.cpuinit.text) *(.meminit.text) _einittext = .; }
......
看到了init.text了吧


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP