我创建了一个处理中断的内核模块。此外,还有一个C程序。
该程序在执行期间导致中断。当中断到来时,应暂停程序,并保持挂起状态 - 直到内核模块中的中断处理程序完成处理此中断为止。
请告诉我,如何实现这一目标?
答案 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