(4-1)linux内核中,对于内核的各个模块的初始化,正是通过使用__define_initcall()的衍生宏定义接口API将初始化函数放置到__initcall##id.initsection中,不同模块的初始化函数按照调用级别顺序排列。在内核启动阶段,这些放置到这个section中的函数指针将被do_initcalls()按顺序依次调用,进而完成各个模块的初始化。 linu...
内核是通过do_initcalls函数循环调用执行initcall.init section内的函数的,流程如下: start_kernel -> rest_init -> kernel_thread -> init -> do_basic_setup -> do_initcalls 这里要分析两个函数: kernel_thread和do_initcalls,这两个函数都定义在init/main.c内 1) kernel_thread 1.static void noinline re...
从上述代码可见,initcall_levels数组中的元素为initcall_t类型的指针,回到do_initcalls()函数中,该函数的核心操作是:按顺序从__initcall0_start开始,到__initcall_end结束的节段(称为初始化调用段)中取出不同段之间的函数,并执行。 存在这几个初始化调用段之间的函数都是内核中各个模块的初始化函数,而这些函数是...