我正在制作一个仿真驱动程序,它要求我在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
在内核代码中,您可以在中断上下文或进程上下文 根据你的目标,你可以找到一些策略来实现你的目标。对我来说,你必须显式地调用 以下是一种可能的方法(但同样,这取决于您的具体目标)。在IRQ中,您可以通过schedule()
而不是依赖于自然的内核流,这听起来很奇怪。schedule_work()
在工作队列上安排工作。实际上,根据设计,工作队列在进程上下文中执行内核代码。从那里,您可以调用阻塞函数并访问当前流程数据。