【问题标题】:get current->pid while in interrupt在中断中获取 current->pid
【发布时间】:2012-05-21 04:47:51
【问题描述】:

我正在linux调度程序上写一些东西,我需要知道在我的中断到来之前哪个进程正在运行..当前结构是否可用?如果我在中断处理程序中执行 current->pid,我会得到我中断的进程的 pid 吗?

【问题讨论】:

    标签: linux linux-kernel kernel scheduling interrupt-handling


    【解决方案1】:

    可以,current->pid 存在并且是被中断的进程(可能是空闲线程,或任何线程)。

    如果您在 Linux 调度程序中编写代码,您应该非常小心。 current 会在调度程序选择要运行的新进程时更改,因此它的值取决于您阅读它的确切时间。

    【讨论】:

    • current 只是掩盖了 %esp 的低位,对吧? Linux中有一种叫做中断堆栈的东西。如果中断将您切换到其他堆栈并且您屏蔽了 %esp,那么您离任何有效的 struct task_info 都不远。 IOW task_info 是堆栈的一部分,您不会在中断堆栈上找到它。我错过了什么?
    • @mooray,current 有效。 current 首先获得 thread_info(在 x86 中,通过屏蔽 %esp),它在其中找到指向 task_struct 的指针。当切换到中断栈时,do_IRQ根据进程的内核栈设置这个指针。
    • @ugoren,很抱歉唤醒了这个旧线程,但您能再澄清一点吗?据我在内核源代码中看到的,current 确实必须在您描述的 32 位 x86 系统上工作,execute_on_irq_stack() 在 IRQ 的线程信息中存储指向task_struct 的正确指针。但是 x86-64 呢?看来,irq_stack_union 中或附近没有线程信息,而且我还没有找到在此架构上适当设置 task 字段的代码。也许,我错过了什么?
    • @Eugene,我不确定机制,但它已被处理。当进程中断时,current 指向该进程。事实上,x86_64 由于堆栈替换使事情变得更加复杂,但它仍然有效。
    【解决方案2】:

    我不希望 current 在进程上下文之外有效。如果您正在使用调度程序,也许您可​​以掌握它存储指向正在运行任务的指针的位置,例如结构 cfs_rq。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-05
      • 1970-01-01
      • 2021-02-10
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 2012-08-29
      相关资源
      最近更新 更多