我正在为linux创建一个内核模块。我需要它来检查每个进程在内核例程中花费了多少时间。我知道内核将这些信息保存在task_struct中。我的问题是我不确定如何将这些信息输入到我的模块中。在模块中创建task_struct?我如何从每个过程中获取信息?
答案 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)
。添加并重新编译内核将允许内核模块动态链接。