#define arch_initcall_sync(fn) __define_initcall(fn, 3s) #definesubsys_initcall(fn) __define_initcall(fn, 4) #define subsys_initcall_sync(fn) __define_initcall(fn, 4s) #define fs_initcall(fn) __define_initcall(fn, 5) #define fs_initcall_sync(fn) __define_initcall(fn, 5s) #define...
do_one_initcall(*fn); } 从上述代码可见,在函数的最后也是一个for循环结构,该循环的操作对象为函数指针,且会将对应的函数指针传递到do_one_initcall中,在该函数执行函数指针所指向的函数: 三、构造section并添加函数 (3-1)构造初始化调用section 在linux内核中,不同架构(ARCH)下的kernel目录中,都会有一个名为...
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...
#define core_initcall(fn) __define_initcall(fn, 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) #defi...
就像你从标题所理解的,这部分将涉及 Linux 内核中有趣且重要的概念,称之为initcall。在 Linux 内核中,我们可以看到类似这样的定义: early_param("debug", debug_kernel); 或者 arch_initcall(init_pit_clocksource); 在我们分析这个机制在内核中是如何实现的之前,我们必须了解这个机制是什么,以及在 Linux 内核中是...
do_one_initcall(initcall_from_entry(fn)); } module_init等级 module_init宏使用的是device_initcall,等级为6: #definedevice_initcall(fn)__define_initcall(fn,6) ...#define__initcall(fn)device_initcall(fn) ...#definemodule_init(x)__initcall(x); 在一些内核...
do_one_initcall+0xd4/0x210 [ 459.516550] [<ffffffff8119d0b2>] ? __vunmap+0xb2/0x100 [ 459.516554] [<ffffffff810ed9b1>] load_module+0x13c1/0x1b80 [ 459.516557] [<ffffffff810e9560>] ? store_uevent+0x40/0x40 [ 459.516560] [<ffffffff810ee2e6>] SyS_finit_module+0x86/0xb0 [ ...
start_kernel|--->rest_init|--->kernel_init|--->kernel_init_freeable|--->do_basic_setup|--->driver_init|--->do_initcalls|--->do_initcall_level|--->do_one_initcall 注意,这里就是驱动的初始化和驱动模块的加载。 我们知道在 rest_init 函数中,最重要的 1 号进程和 2 号进程都已经起来了...
1. do_initcalls() 路径:linux-3.10.x\init\main.c start_kernel()-->rest_init()-->kernel_init()-->kernel_init_freeable()-->do_basic_setup()-->do_initcalls()-->do_initcall_level()-->do_one_initcall() do_initcalls()将按顺序从由__initcall_start开始,到__initcall_end结束的section中...
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_...