【发布时间】:2012-05-21 04:47:51
【问题描述】:
我正在linux调度程序上写一些东西,我需要知道在我的中断到来之前哪个进程正在运行..当前结构是否可用?如果我在中断处理程序中执行 current->pid,我会得到我中断的进程的 pid 吗?
【问题讨论】:
标签: linux linux-kernel kernel scheduling interrupt-handling
我正在linux调度程序上写一些东西,我需要知道在我的中断到来之前哪个进程正在运行..当前结构是否可用?如果我在中断处理程序中执行 current->pid,我会得到我中断的进程的 pid 吗?
【问题讨论】:
标签: linux linux-kernel kernel scheduling interrupt-handling
可以,current->pid 存在并且是被中断的进程(可能是空闲线程,或任何线程)。
如果您在 Linux 调度程序中编写代码,您应该非常小心。 current 会在调度程序选择要运行的新进程时更改,因此它的值取决于您阅读它的确切时间。
【讨论】:
current 有效。 current 首先获得 thread_info(在 x86 中,通过屏蔽 %esp),它在其中找到指向 task_struct 的指针。当切换到中断栈时,do_IRQ根据进程的内核栈设置这个指针。
current 确实必须在您描述的 32 位 x86 系统上工作,execute_on_irq_stack() 在 IRQ 的线程信息中存储指向task_struct 的正确指针。但是 x86-64 呢?看来,irq_stack_union 中或附近没有线程信息,而且我还没有找到在此架构上适当设置 task 字段的代码。也许,我错过了什么?
current 指向该进程。事实上,x86_64 由于堆栈替换使事情变得更加复杂,但它仍然有效。
我不希望 current 在进程上下文之外有效。如果您正在使用调度程序,也许您可以掌握它存储指向正在运行任务的指针的位置,例如结构 cfs_rq。
【讨论】: