1)#define core_initcall_sync(fn) __define_initcall(fn, 1s)#define postcore_initcall(fn) __define_initcall(fn, 2)#define postcore_initcall_sync(fn) __define_initcall(fn, 2s)#define arch_initcall(fn) __define_initcall(fn, 3)#define arch_initcall_sync(fn) __define_initcall...
在这个例子中,init_function_1被放置在.initcall1.init节(section)中,而init_function_2则被放置在.initcall2.init节(section)中。这样,在内核启动时,这些函数就会按照其在源文件中出现的顺序依次被调用。 通过使用带有不同标识符的宏定义,可以将多个初始化函数放置在不同的.initcall节(section)中,从而实现按顺序...
正如我们刚看到的,do_initcall_level函数有一个参数 -initcall的级别,做了以下两件事:首先这个函数拷贝了initcall_command_line,这是通常内核包含了各个模块参数的命令行的副本,并用kernel/params.c源码文件的parse_args函数解析它,然后调用各个级别的do_on_initcall函数: for (fn = initcall_levels[level]; fn < ...
#define core_initcall_sync(fn) __define_initcall(fn, 1s) #define postcore_initcall(fn) __define_initcall(fn, 2) #define postcore_initcall_sync(fn) __define_initcall(fn, 2s) #define arch_initcall(fn) __define_initcall(fn, 3) #define arch_initcall_sync(fn) __define_initcall(fn, 3s)...
文件位置:\linux-xxx\arch\arm\kernel\vmlinux.lds.S 文件位置:\linux-xxx\include\asm-generic\vmlinux.lds.h : __initcall_start = .; .initcall.init: { *(.initcall1.init) ... *(.initcall7.init) } __initcall_end = .; 上面是INIT_CALLS对应的函数,*(.initcall##level##.init),这个函数...
initcall的调用流程: start_kernel->kernel_init->kernel_init_freeable->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_...
文件位置:linux-xxxarcharmkernelvmlinux.lds.S 文件位置:linux-xxxincludeasm-genericvmlinux.lds.h : __initcall_start = .; .initcall.init : { *(.initcall1.init) ... *(.initcall7.init) } __initcall_end = .; 上面是INIT_CALLS对应的函数,*(.initcall##level##.init),这个函数就对应了__de...
* @x: function to be run at kernel boot time or module insertion * * module_init() will either be called during do_initcalls() (if * builtin) or at module insertion time (if a module). There can only * be one per module. ...
Linux对initcall的调用 在Linux启动时,会依次遍历所有等级的initcall,以完成一系列的初始化。 initcall的调用流程: start_kernel->kernel_init->kernel_init_freeable->do_basic_setup->do_initcalls->do_initcall_level() 在do_initcalls()函数中,会遍历所有等级的initcall,完成初始化。
start_kernel->kernel_init->kernel_init_freeable->do_basic_setup->do_initcalls->do_initcall_level() 在函数中,会遍历所有等级的,完成初始化。 staticvoid__initdo_initcalls(void){int level;size_t len=strlen(saved_command_line)+1;char*command_line;command_line=kzalloc(len,GFP_KERNEL);if(!comman...