- 论坛徽章:
- 0
|
#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 |
|