查找在内核例程中花费的CPU时间进程量

时间:2011-11-01 23:02:49

标签: linux-kernel kernel-module

我正在为linux创建一个内核模块。我需要它来检查每个进程在内核例程中花费了多少时间。我知道内核将这些信息保存在task_struct中。我的问题是我不确定如何将这些信息输入到我的模块中。在模块中创建task_struct?我如何从每个过程中获取信息?

2 个答案:

答案 0 :(得分:2)

查看文件linux / kernel / taskstats.c,它如何从运行任务中收集数据。也许你可以重用一些代码。

答案 1 :(得分:2)

从Linux内核模块中迭代所有进程有点棘手,因为内核可能无法导出所有必需的符号。您可能需要稍微修改内核和/或依赖于此作业的更深层API,这不是内核模块通常采取的操作。

让我们看一下现有内核代码的示例。 Linux 2.6.39,kernel / cpu.c:

static inline void check_for_tasks(int cpu)
{
    struct task_struct *p;

    write_lock_irq(&tasklist_lock);
    for_each_process(p) {
            if (task_cpu(p) == cpu && p->state == TASK_RUNNING &&
                (!cputime_eq(p->utime, cputime_zero) ||
                 !cputime_eq(p->stime, cputime_zero)))
                    printk(KERN_WARNING "Task %s (pid = %d) is on cpu %d "
                            "(state = %ld, flags = %x)\n",
                            p->comm, task_pid_nr(p), cpu,
                            p->state, p->flags);
    }
    write_unlock_irq(&tasklist_lock);
}

此函数迭代任务列表。当然,对于您的使用,如果您不修改列表,则可以使用读锁而不是写锁。

请注意,tasklist_lock未导出(即源中没有EXPORT_SYMBOL(tasklist_lock)。添加并重新编译内核将允许内核模块动态链接。