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

发布于 2024-12-13 02:48:59 字数 149 浏览 0 评论 0原文

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

I am creating a kernel module for linux. I need it to check how much time each process has spent inside kernel routines. I know the kernel keeps this information inside stime within task_struct. My problem is that I am not sure how I get this information into my module for each process. do I create a task_struct in my module? How do I get the information from every process?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

渡你暖光 2024-12-20 02:48:59

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

Look at the file linux/kernel/taskstats.c, how it collects the data from the runnings tasks. Maybe you can reuse some of the code.

七七 2024-12-20 02:48:59

从 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)。添加它并重新编译内核将允许您的内核模块动态链接)。

Iterating all processes from a Linux kernel module is a bit tricky because the kernel might not export all the necessary symbols. You might need to modify the kernel a tiny bit and/or depend on deeper APIs for this job, which is not an action usually being taken by kernel modules.

Let's look at an example from existing kernel code. 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);
}

This function iterates the task list. Of course, for your usage you can use a read lock instead of write lock, if you are not modifying the list.

Note that tasklist_lock is not exported (i.e. there's no EXPORT_SYMBOL(tasklist_lock) anywhere in the sources. Adding that and recompiling the kernel will allow your kernel module to dynamically link).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文