测量 linux 内核从启动到用户节奏所花费的时间



是否有一种基于内核检测的方法来测量内核在启动期间传输到用户空间的时间?我可以将printk与定时信息一起使用,但我只是不确定,究竟在哪里放置这个printk,以便观察内核何时转移到用户空间。

start_kernel()由特定于体系结构的代码(arch/architecture_type)调用。内核加载后,它从init_post()调用第一个用户空间进程,即/sbin/init(或更新发行版上的 systemd) 这两个函数都在 init/main.c 中定义。

您可能需要阅读此博客,了解启动过程的详细说明。

创建自己的 init 并立即记录到/dev/kmsg

使用printk破解内核代码的更简单的替代方法是使用以下 init:

#include <stdio.h>
#include <unistd.h>
int main(void) {
    FILE *fp;
    fp = fopen("/dev/kmsg", "w");
    fputs("hello initn", fp);
    fclose(fp);
    while (1)
        sleep(0xFFFFFFFF);
}

并使用内核命令行参数:

init=/path/to/myinit printk.devkmsg=on printk.time=y

现在,在启动结束和初始化启动后,我们会看到一条消息:

[<timestamp>] hello init

这不是 100% 精确的,因为您将fopen损失一些 CPU 周期,但我认为这无关紧要。

最少的可重现设置来测试它:

  • https://github.com/cirosantilli/linux-kernel-module-cheat/tree/88cd83cd020af12b987afab5e990099f7efa2107#custom-init
  • https://github.com/cirosantilli/linux-kernel-module-cheat/blob/88cd83cd020af12b987afab5e990099f7efa2107/kernel_module/user/init_dev_kmsg.c

最新更新