我们需要能够使用中断从用户空间唤醒进程的功能。
为此,我们正在执行以下操作: ·用户空间程序–与ioctl()一起进入内核空间并调用等待que_head。 此时,用户空间线程块。 ·发生中断时,它会向内核空间调用另一个ioctl()并唤醒内核进程。 ·此时,用户空间程序将不再阻塞并继续执行。
这是使用以下伪代码实现的:
static DECLARE_WAIT_QUEUE_HEAD(int0_wait);
static u32 int0_wait_flag = 0 ;
*/ inside the Kernel ioctl function */
case WAIT_INT_0:
wait_event_inetrruptible(int0_wait, int0_wait_flag !=0); /* blocked here */
int0_wait_flag = 0;
printk("Returning from IOCTL kernel …\n");
break;
/* interrupt handler */
Irqreturn_t irq_handler(int irq, void *dev)
{
Int0_eait_flag = 1;
wake_up_interruptible(&int0_wait);
return IRQ_HANDLED;
}
/* a user space test program */
Int_function()
{
ioctl(…, WAIT_INT_0, …); /* call the kernel for blocking */
/* comes here when IRQ arrives */
/* continue with run the rest of code…. */
当我们这样做时–我们几乎总是在内核中得到一个BUG: […..]呼叫跟踪: […..] BUG:原子调度:TesterCpp / 2000 / 0x00000200 ……