暂停程序执行直到处理中断 - 如何实现?

时间:2013-03-06 11:54:06

标签: c linux module interrupt interrupt-handling

我创建了一个处理中断的内核模块。此外,还有一个C程序。

该程序在执行期间导致中断。当中断到来时,应暂停程序,并保持挂起状态 - 直到内核模块中的中断处理程序完成处理此中断为止。

请告诉我,如何实现这一目标?

2 个答案:

答案 0 :(得分:1)

您可以在内核模块正在执行的情况下等待设置了属性PTHREAD_PROCESS_SHARED的互斥锁,当内核模块完成时,您可以发出互斥信号,以便您的进程可以继续。

要设置此项,您可以使用pthread_mutexattr_setpshared

还有:

  

对于进程间同步,需要分配互斥锁   在这些进程之间共享的内存中。既然记忆就是这样的   必须动态分配互斥锁,互斥量需要   使用mutex_init()显式初始化。

答案 1 :(得分:1)

This program causes interrupts during its execution

我假设用户空间程序正在进行软中断/系统调用,并且您已经编辑了内核系统调用表,并分配了自定义系统调用的编号,并使用您的自定义系统调用重新编译和安装内核/ soft中断。

  

当中断到来时,程序应该暂停,并且   保持挂起 - 直到内核模块中的中断处理程序   完成处理此中断。

为了在你的程序调用软中断时发生这种情况,你必须使你的irq以原子方式运行,这样,在你的程序调用另一个软中断之前,先前的中断将被处理掉,而不会被抢占通过任何其他更高优先级的中断。要实现这种原子性,可以在irq处理程序中使用自旋锁。

实施例

spinlock_t mLock = SPIN_LOCK_UNLOCK;
unsigned long flags;

spin_lock_irqsave(&mLock, flags); // save the state, if locked already it is saved in flags
// IRQ Handler Code here
spin_unlock_irqsave(&mLock, flags); // return to the formally state specified in flags