xxx_initcall的定义位于include/linux/init.h中,从这个文件的名字也可以看出xxx_initcall是针对初始化操作的。 #define pure_initcall(fn) __define_initcall(fn, 0)#define core_initcall(fn) __define_initcall(fn, 1)#define core_initcall_sync(fn) __define_initcall(fn, 1s)#define postcore_initcall(fn...
对于静态加载的驱动,内核定义了诸如early_initcall、pure_initcall、core_initcall 等众多宏。就拿 core_initcall 来说,它背后其实是 __define_initcall 宏在发挥关键作用。展开来看,__define_initcall(fn, 1)(这里以 core_initcall 的参数 1 为例),经过层层解析,就像是一场奇妙的 “魔术表演”:先是定义了一个...
其实开启DEBUG宏的方法很简单,在需要pr_debug/dev_dbg输出的模块开头,直接#define DEBUG即可,kernel中有一个例子: /* init/main.c */ #define DEBUG /* Enable initcall_debug */ 不过这种方法有个缺点:我们必须准确的知道需要debug那个C文件,如果想大网撒鱼(例如,想debug为什么新修改的DTS文件没有起作用,而又...
(a)、SLUB_DEBUG 内核中小块内存大量使用slab/slub分配器,slub_debug提供了:访问已经释放的内存、越界访问、重复释放内存等功能检测。 支持slub_debug内核配置 重新配置kernel选项,打开如下选项即可。 CONFIG_SLUB=y CONFIG_SLUB_DEBUG=y CONFIG_SLUB_DEBUG_ON=y (1)、重复释放 2c4+10c -> 3D0 (2)、内存越界...
三、进阶 | Linux 内核概念(2):initcall initcall 机制 介绍 就像你从标题所理解的,这部分将涉及 Linux 内核中有趣且重要的概念,称之为initcall。在 Linux 内核中,我们可以看到类似这样的定义: early_param("debug", debug_kernel); 或者 arch_initcall(init_pit_clocksource);...
1.1.1 打开initcall_debug bool initcall_debug = true; 这样做的目的是在内核kmsg中记录每个initcall的calling和initcall时间,本工具分析依赖于这些kmsg。 [ ](javascript:void(0); "复制代码") staticint__init_or_moduledo_one_initcall_debug(initcall_tfn){ktime_tcalltime, delta, rettime;unsignedlonglong...
如使用initcall_debug可能需要在内核配置中使用CONFIG_LOG_BUF_SHIFT增加日志缓冲区的大小。还可能需要使能CONFIG_PRINTK_TIME和CONFIG_KALLSYMS。 1.2 使用内核启动图进行有目的的优化 使用initcall_debug可以生成启动图,从而轻松查看哪些内核初始化函数需要最多时间来执行。
linux4.14/arch/arm/kernel/vmlinux.lds.S 这里可以看到链接时候 Linux 入口是 stext 段,这里是启动引导程序跳转过来的第一段Linux 代码: 第一:Linux入口地址 我们先看一下入口地址的确定,同一文件。 SECTIONS { /* * XXX: The linker does not define how output sections are ...
即便禁用了 CONFIG_BLOCK 和 CONFIG_MMC 后,总启动时间仍多了 20ms。这可能是因为 Kernel + initramfs 拼在一起之后,内核变大了许多,而内核镜像是需要解压,解压的时间增多了。 4、优化内核 评估方法: 在启动参数里添加 initcall_debug,能得到更多内核 log: ...