在Linux IRQ中调用schedule()

时间:2015-12-14 16:13:44

标签: linux-kernel linux-device-driver user-mode-linux

我正在创建一个仿真驱动程序,要求我在ATOMIC上下文中调用schedule()以使仿真部分工作。现在我有这个hack,允许我在ATOMIC(例如自旋锁)上下文中调用schedule()

int p_count = current_thread_info()->preempt_count;

current_thread_info()->preempt_count = 0;
schedule();
current_thread_info()->preempt_count = p_count;

但是这在IRQ内部不起作用,系统只是停止调用schedule()

有没有办法以允许我这样做的方式破解内核?我使用Linux内核4.2.1和用户模式Linux

1 个答案:

答案 0 :(得分:5)

在内核代码中,您可以在中断上下文进程上下文中。 当您处于中断上下文中时,您无法调用任何阻止函数(例如schedule())或访问current指针。这与内核的设计方式有关,并且无法在中断上下文中使用这些功能。另请参阅this answer

根据您的目的,您可以找到一些可以实现目标的策略。对我来说,你必须明确地调用schedule()而不是依赖于自然的内核流程,这听起来很奇怪。

接下来是一种可能的方法(但同样,这取决于您的具体目标)。形成IRQ,您可以在work queueschedule_work()上安排工作。事实上,工作队列通过设计在进程上下文中执行内核代码。从那里,您可以调用阻塞函数并访问当前流程数据。