1 open initcall_debug in kernel Open initcall_debug : this can printf initcall function in kernel console. diff --git a/init/main.c b/init/main.c index649c622..67e0783100644--- a/init/main.c +++ b/init/main.c @@-723,7+723,7@@staticvoid__initdo_ctors(void) #endif } -boolini...
处理完进入黑名单的 initcalls,接下来的代码直接调用 initcall: if (initcall_debug) ret = do_one_initcall_debug(fn); else ret = fn(); 取决于 initcall_debug 变量的值,do_one_initcall_debug 函数将调用 initcall,或直接调用 fn()。initcall_debug 变量定义在同一个源码文件: bool initcall_debug; 该变...
说明initcall_debug是一个内核参数,可以跟踪initcall,用来定位内核初始化的问题。在cmdline中增加initcall_debug后,内核启动过程中会增加如下形式的日志,在调用每一个init函数前有一句打印,结束后再有一句打印并且输出了该Init函数运行的时间,通过这个信息可以用来定位启动过程中哪个init函数运行失败以及哪些init函数运行时间较...
说明initcall_debug是一个内核参数,可以跟踪initcall,用来定位内核初始化的问题。在cmdline中增加initcall_debug后,内核启动过程中会增加如下形式的日志,在调用每一个init函数前有一句打印,结束后再有一句打印并且输出了该Init函数运行的时间,通过这个信息可以用来定位启动过程中哪个init函数运行失败以及哪些init函数运行时间较...
5.1 initcall_debug CMDLINE中增加initcall_debug选项 console=ttyS0,115200...initcall_debug 打开CMDLINE选项 CMD选项 结果: [root@rk3399:/]#dmesg|grepinitcall[0.000000]Kernelcommandline:initcall_debugstoragemedia=emmcandroidboot.storagemedia=emmcandroidboot.mode=normalandroidboot.slot_suffix=androidboot.serial...
虽然initcall_debug是一个不错的调试手段,可以用来检测各initcall的执行时间。然而,当内核打印级别设置的不合适时,这些调试日志会直接打印在控制台上,并且和其他日志信息混杂到了一起,便会显得杂乱无章。 5.2 ftrace 如果是2018年以后的内核(4.16.0-rc4),则可以基于ftrace分析initcall的执行情况。
int__init_or_module do_one_initcall(initcall_t fn){intcount=preempt_count();intret;charmsgbuf[64];if(initcall_blacklisted(fn))return-EPERM;if(initcall_debug)ret=do_one_initcall_debug(fn);elseret=fn();msgbuf[0]=0;if(preempt_count()!=count){ ...
early_param("debug", debug_kernel); 或者 arch_initcall(init_pit_clocksource); 在我们分析这个机制在内核中是如何实现的之前,我们必须了解这个机制是什么,以及在 Linux 内核中是如何使用它的。像这样的定义表示一个回调函数,它们会在 Linux 内核启动中或启动后调用。实际上initcall机制的要点是确定内置模块和子系...
调试方法包括`initcall_debug`和`ftrace`。`initcall_debug`通过CMDLINE选项启用,帮助检测耗时较长的初始化调用。然而,可能因日志级别设置不当,导致调试信息与常规日志混杂。相比之下,`ftrace`在较新内核版本中提供更细致的追踪分析,通过打开trace功能并使用CMDLINE选项,能够详尽追踪initcall执行情况。
char msgbuf[40]; int result; if (initcall_debug) { printk("Calling initcall 0x%p", *call); print_fn_descriptor_symbol(": %s()", (unsigned long) *call); printk("\n"); t0 = ktime_get(); } result = (*call)(); ... }