__init 只是告诉内核,你这个函数执行一次就不再执行,因此该函数空间可以释放,当栈用。
内核就把这些 标记着__init的收集到一块,.init段内,执行顺序是由 arch_initcall() , module_init()。
.initcall1.init
.initcall2.init
.initcall3.init
.initcall4.init
.initcall5.init
.initcall6.init
.initcall7.init
core_initcall(fn) --->.initcall1.init
postcore_initcall(fn) --->.initcall2.init
arch_initcall(fn) --->.initcall3.init
subsys_initcall(fn) --->.initcall4.init
fs_initcall(fn) --->.initcall5.init
device_initcall(fn) --->.initcall6.init
late_initcall(fn) --->.initcall7.init
INITCALL这个宏定义只有把它放到vmlinux.lds.s里面看才有意义。
.initcall.init :
{
___initcall_start = .;
INITCALLS
___initcall_end = .;
}
从__early_initcall_end执行到__initcall_end
kernel将初始化要执行的init函数,分为7个级别,
core_initcall, postcore_initcall, arch_initcall, subsys_initcall, fs_iitcall, device_initcall,late_initcall。
这7个级别优先级递减,即先执行core_initcall,最后执行late_initcall(二中将具体讲述这些宏)。
通过使用文中提到的宏,gcc会将初始化代码按下面的结构安排
kernel将初始化要执行的init函数,分为7个级别,core_initcall, postcore_initcall, arch_initcall, subsys_initcall, fs_iitcall, device_initcall, late_initcall。这7个级别优先级递减,即先执行core_initcall, 最后执行late_initcall(二中将具体讲述这些宏)。通过使用文中提到的宏,gcc会将初始化代码按下面的结构安排