linux系统启动中的initcall实现原理和调试方法
发布网友
发布时间:2024-09-28 15:05
我来回答
共1个回答
热心网友
时间:2024-09-28 15:12
Linux系统启动中的initcall机制是内核经典设计之一,用于在启动过程中调用不同的初始化函数。此机制不仅简化了代码结构,还提升了代码的可维护性。在2018年,为追踪并调试初始化函数耗时,Steven Rostedt引入了追踪功能。
initcall的意义在于执行特定架构下CPU与外设驱动的初始化,不需显式传递、存储和调用函数指针,只需标记函数类型即可自动执行。基于initcall的初始化代码应以`__init`修饰,并使用`xxx_initcall`声明初始化类型。
initcall实现原理基于`__define_initcall`宏,将所有`xxx_initcall`统一链接至不同subsection,根据ID编号排序执行。通过`rockchip_grf_init()`示例,可见使用GNU编译工具链属性实现细节。
执行流程涉及生成不同类别的section,内部函数按照编译顺序执行,不同类之间在`init/main.c`中定义执行顺序。`do_initcalls()`遍历ID编号的initcall,通过`xxx_start`链接找到相对应的`.initcall entry`,进而循环执行各初始化函数。
调试方法包括`initcall_debug`和`ftrace`。`initcall_debug`通过CMDLINE选项启用,帮助检测耗时较长的初始化调用。然而,可能因日志级别设置不当,导致调试信息与常规日志混杂。相比之下,`ftrace`在较新内核版本中提供更细致的追踪分析,通过打开trace功能并使用CMDLINE选项,能够详尽追踪initcall执行情况。