1

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

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 的 Linux 内核 4.2.1

4

1 回答 1

5

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

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

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

于 2015-12-14T16:28:08.180 回答