在内核空间中调用times()

时间:2015-04-07 23:35:43

标签: linux-kernel posix kernel-module system-calls

我正在开发一个内核模块,我需要获得某个进程消耗的CPU时间的近似值(迭代进程不是问题)。具体来说,我想要libc clocktimes系统调用提供的相同行为。我试着调用do_sys_times,但似乎没有导出(编译时未定义的符号)。

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

1 个答案:

答案 0 :(得分:1)

如果要在内核中的某些事件之间精确测量时间(如上下文切换),则需要一些跟踪器,如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上花费的时间。