在Linux IRQ中调用schedule()



我正在制作一个仿真驱动程序,它要求我在ATOMIC上下文中调用schedule(),以便使仿真部分工作。现在我有了这个破解,可以在ATOMIC(例如spinlock)上下文中调用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

在内核代码中,您可以在中断上下文进程上下文

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

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

最新更新