Linux kernel 在Linux IRQ中调用schedule()

Linux kernel 在Linux IRQ中调用schedule(),linux-kernel,linux-device-driver,user-mode-linux,Linux Kernel,Linux Device Driver,User Mode Linux,我正在制作一个仿真驱动程序,它要求我在原子上下文中调用schedule(),以使仿真部分正常工作。目前,我有一个黑客程序,允许我在原子(例如自旋锁)上下文中调用schedule(): 但这在IRQ内部不起作用,系统只是在调用schedule()后停止 有没有什么方法可以让我破解内核?我正在使用Linux内核4.2.1和用户模式Linux在内核代码中,您可以在中断上下文或进程上下文中。 当您处于中断上下文中时,您不能调用任何阻塞函数(例如,schedule())或访问当前指针。这与内核的设计方式有

我正在制作一个仿真驱动程序,它要求我在原子上下文中调用
schedule()
,以使仿真部分正常工作。目前,我有一个黑客程序,允许我在原子(例如自旋锁)上下文中调用
schedule()

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


有没有什么方法可以让我破解内核?我正在使用Linux内核4.2.1和用户模式Linux

在内核代码中,您可以在中断上下文进程上下文中。 当您处于中断上下文中时,您不能调用任何阻塞函数(例如,
schedule()
)或访问
当前
指针。这与内核的设计方式有关,在中断上下文中不可能有这样的功能。另见

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


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

在内核代码中,您可以在中断上下文中,也可以在进程上下文中。 当您处于中断上下文中时,您不能调用任何阻塞函数(例如,
schedule()
)或访问
当前
指针。这与内核的设计方式有关,在中断上下文中不可能有这样的功能。另见

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

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

int p_count = current_thread_info()->preempt_count;

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