在内核中调用 times() space

Calling times() in kernel space

我正在开发内核模块,我需要获得某个进程消耗的 CPU 时间的近似值(迭代进程不是问题)。具体来说,我想要 libc clock or the times syscall. I tried calling do_sys_times 提供的相同行为,但似乎没有导出(编译时未定义符号)。

有没有办法在内核模块中调用 times?还有其他选择吗?

如果你想精确测量内核中某些事件(如上下文切换)之间的时间,你需要一些跟踪器,如 SystemTap。从内核模块中,您可以通过各种跟踪和分析子系统(如 ftrace、perf 或 kprobes)直接绑定探测器。

这是一个在上下文切换时将消息转储到内核日志的示例:

#include <linux/sched.h>
#include <linux/module.h>
#include <linux/printk.h>
#include <linux/tracepoint.h>

#include <trace/events/sched.h>

...

void my_sched_switch_probe(void* ignore, struct task_struct* prev, struct task_struct* next) {
    printk("my_sched_switch_probe: %s -> %s at %lu\n", prev->comm, next->comm, 
        (unsigned long) sched_clock());
}

int cswtracer_init(void) {
    register_trace_sched_switch(my_sched_switch_probe, NULL);

    return 0;
}

void cswtracer_fini(void) {
    unregister_trace_sched_switch(my_sched_switch_probe, NULL);
}

module_init(cswtracer_init);
module_exit(cswtracer_fini);

注意:不要 运行 它,它会显着降低您的系统速度。

因此分析 my_sched_switch_probe() 中进程的名称并计算进程进入 CPU (next->comm == "myprocessname") 和离开 CPU (prev->comm == "myprocessname").这个差异是最后一个时间段过程花费在 CPU during.