当前位置:  开发笔记 > 运维 > 正文

在Linux IRQ中调用schedule()

如何解决《在LinuxIRQ中调用schedule()》经验,为你挑选了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内核4.2.1和用户模式Linux



1> Claudio..:

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

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

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

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有