请教:内核代码中出现的__init等宏
我在看驱动程序时,发现有的函数的前面有__init,我上网去查了下,说是宏,是编译时会将被修饰的内容放到这些宏所代表的section中,
可是我记得在linux中的section,主要是text,data和bss,好像没有这些init的section,
我在网上看到什么有7个级别的init,我看了不太明白,哪位能说说吗?或者能否提供资料?
另:__init这个宏好像不能在用户级别的应用程序中使用,是吗?(我在helloworld中
使用,编译就不能通过,我已经加了<linux/init.h>头文件) #define __init __attribute__ ((__section__ (".init.text")))
这个写的不是很清楚吗
通常编译器将函数放在.text 节,变量放在.data 或 .bss 节,使用 section 属性,可以让
编译器将函数或变量放在指定的节中。那么前面对__init 的定义便表示将它修饰的代码放
在.init.text节。
__init 修饰的所有代码都会被放在.init.text节里,初始化结束后就可以释放这部分内存。
7个级 linux-2.6.10arch/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.3614等级
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 __init 修饰的所有代码都会被放在.init.text节里,初始化结束后就可以释放这部分内存。
------------------------------------------------------------
那么是不是表示.init.text是被包含在.text节里的?也就是说.text包含.init.text?
回复 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(8); .init.text : AT(ADDR(.init.text) - 0) { _sinittext = .; *(.init.text) *(.cpuinit.text) *(.meminit.text) _einittext = .; }
......
看到了init.text了吧
页:
[1]