内核驱动初始化顺序:
内核第一个C函数 main.c/start_kernel() ---> rest_init() ---> kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND) ---> kernel_init() ---> do_basic_setup() ---> do_initcalls() ---> do_one_initcall()
__define_initcall的作用:
宏定义__define_initcall(level,fn,id)对于内核的初始化很重要,他指示编译器在编译的时候,将一系列初始化函数的起始地址值按照一定的顺序放在一个section中。
在内核初始化阶段,do_initcalls() 将按顺序从该section中以函数指针形式取出这些函数的起始地址,来依次完成相应的初始化。由于内核某些部分的初始化需要依赖于其他某些部分的初始化的完成,因此这个顺序排列常常很重要。
#define module_init(x) __initcall(x);
#define __initcall(fn) device_initcall(fn)
#define device_initcall(fn) __define_initcall("6",fn,6)
1. 分析__define_initcall(level, fn, id) 宏定义:
这个宏定义在 kernel/include/linux/init.h中:<