在实际执行时,内核必须知道xxx_initcall section所在的位置,而在include/asm-generic/vmlinux.lds.h中将xxx_start和.initcall*.init链接到了一起,这样的话,do_initcalls()遍历不同ID的initcall时,基于xxx_start便可以找到想对应的.initcall entry,然后循环遍历里面的各个initcalls。 #define INIT_CALLS_LEVEL(level) ...
do_basic_setup()由kernel_init()代表的内核init线程函数间接调用(在kernel_init_freeable()被调用)。 在调用do_basic_setup之前,处理器已经被初始化了,CPU子系统已经启动并且运行,内存和进程管理也工作正常,但是系统中的设备还没有被初始化,故而do_basic_setup正作用于此,本文主要描述do_initcalls,所以不再进而分...
在内核启动流程的 init/main.c 文件中,有一个至关重要的函数 do_initcalls,它就是那位掌控全局的 “指挥官”。当内核启动进入这个环节,do_initcalls 函数开始施展它的 “魔法”。它会依据预先设定好的优先级顺序,如同一位严谨的列车调度员,依次 “调度” 各个等级的初始化函数。从早期初始化的 early_initcall 开...
看到了执行过程,其中是按照各个level进行调用的,而__define_initcall(level,fn)的作用就是指示编译器把一些初始化函数的指针(即:函数起始地址)按照顺序放置一个名为 .initcall.init 的section中,这个section又被分成了n个子section,它们按顺序排列。在内核初始化阶段,这些放置到这个section中的函数指针将供do_initcalls...
do_initcalls()循环调用do_initcall_level(level),level就是initcall的优先级数字,由for循环的终止条件ARRAY_SIZE(initcall_levels) - 1可知,总共会调用do_initcall_level(0)~do_initcall_level(7),一共七次。 而do_initcall_level(level)中则会遍历initcall_levels[level]中的每个函数指针,initcall_levels[level]...
do_basic_setup-> do_initcalls-> do_initcall_level() 在do_initcalls()函数中,会遍历所有等级的initcall,完成初始化。 static void __init do_initcalls(void) { int level; size_t len = strlen(saved_command_line) + 1; char *command_line; ...
start_kernel()->arch_call_rest_init()->rest_init()---创建新的内核线程执行-->kernel_init()->kernel_init_freeable()->do_basic_setup()->do_initcalls() 接着在do_initcalls函数中,按照优先级,依次执行各个Level的initcall。同一个level内的执行顺序跟链接顺序有关。
黑名单的initcalls保存在blacklisted_initcalls链表中,这个链表是在早期 Linux 内核初始化时由 Linux 内核命令行来填充的。 处理完进入黑名单的initcalls,接下来的代码直接调用initcall: if (initcall_debug) ret = do_one_initcall_debug(fn); else ret = fn(); ...
在do_initcalls()函数中,会遍历所有等级的initcall,完成初始化。 staticvoid__initdo_initcalls(void){intlevel;size_tlen =strlen(saved_command_line) +1;char*command_line; command_line =kzalloc(len, GFP_KERNEL);if(!command_line)panic("%s: Failedto allocate %zu bytes\\n", __func__, len);/...
do_basic_setup 函数的执行,其中包括对文件系统的基本设置。 在do_basic_setup 函数中,会调用do_initcalls 函数。 在do_initcalls函数中,各种初始化函数会按照链接器脚本中的顺序被执行。 fs_initcall函数是其中之一。 看到了执行过程,其中是按照各个level进行调用的,而__define_initcall(level,fn)的作用就是指示编...