查找进程在内核例程中花费的 cpu 时间量
我正在为 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
查看文件 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.
从 Linux 内核模块迭代所有进程有点棘手,因为内核可能不会导出所有必要的符号。您可能需要稍微修改内核和/或依赖于更深层次的 API 来完成此工作,这不是内核模块通常采取的操作。
让我们看一下现有内核代码的示例。 Linux 2.6.39,kernel/cpu.c:
该函数迭代任务列表。当然,根据您的使用情况,如果您不修改列表,则可以使用读锁而不是写锁。
请注意,
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:
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 noEXPORT_SYMBOL(tasklist_lock)
anywhere in the sources. Adding that and recompiling the kernel will allow your kernel module to dynamically link).