【问题标题】:attach preempt_notifier to user process in linux将 preempt_notifier 附加到 linux 中的用户进程
【发布时间】:2012-08-09 23:10:38
【问题描述】:

我需要确定用户进程是否曾经以某种方式被抢占,我知道我们在 preempt.h 和 sched.c 中有钩子,它们允许我们定义 preempt_notifiers 可以在进程重新调度时依次调用 sched_in 和 sched_out 函数或被抢占。

但我仍然不知道如何将通知程序附加到用户空间中的特定进程或 pid,然后以某种方式记录该特定进程是否曾被抢占。我假设我必须编写一个模块来执行此操作,但是我将如何将 pid 附加到特定的通知程序?

【问题讨论】:

    标签: linux linux-kernel preemption


    【解决方案1】:

    通知程序本质上是每个进程的。当您注册它时,您正在为当前进程注册它。参见preempt_notifier_register() 中的代码,它将通知程序附加到current->preempt_notifiers

    【讨论】:

    • 是的,这是正确的,但是 preempt_notifier_register() 只能由内核模块访问,我如何确定当前是我想要注册通知程序的用户进程。有没有办法将通知程序固定到特定的 pid,即 current.pid = my pid .
    • 你要监控的进程需要调用你的内核模块,那么current就是正确的进程。
    • 对不起,我是新手,所以我应该从用户进程到内核模块进行系统调用,我该怎么做呢?我需要来自用户进程的真正低延迟调用,它可以访问模块功能。有什么想法吗?
    • 您可以添加一个系统调用,这是一种方法。但是在模块中添加系统调用有点复杂——因为系统调用可能在模块未加载时被调用。另一种选择是让您的模块创建一个字符设备并使用ioctl() 回调作为pseduo-syscall,例如,这就是KVM 的实现方式。
    【解决方案2】:

    伪文件/proc/<pid>/status 包含一行nonvoluntary_ctxt_switches:,这似乎是您要查找的信息。

    【讨论】:

    • 我不确定。查看 __schedule() 中的代码,当进程运行到其时间片结束时,它看起来也会增加。但我可能是错的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多