异步处理方式-爱代码爱编程
1、通过open普通文件,在内核里面使用信号量的方式
应用层调用iotrl陷入内核等待信号量释放,以异步的方式(如中断)去释放信号量。
2、通过open普通文件(提供poll函数), 在内核创建等待队列的方式。
应用层通过poll,陷入内核,在poll里面poll_wait, 然后在中断里面wake_up_interruptible
3、通过创建uio设备的方式,创建uio设备,uio设备还可以方便mmap设备资源。
udev->info.irq_flags = IRQF_NO_THREAD;
udev->info.irq = irq_num; //需要把设备的中断号给上
udev->info.handler = igbuio_pci_irqhandler;
static irqreturn_t igbuio_pci_irqhandler(int irq, struct uio_info info)
{
if (udev->mode == RTE_INTR_MODE_LEGACY && !pci_check_and_mask_intx(udev->pdev))
{
return IRQ_NONE;
}
//返回IRQ_HANDLED时,linux uio框架会唤醒等待uio中断的进程。注册到epoll的uio中断事件就会被调度
/ Message signal mode, no share IRQ and automasked */
return IRQ_HANDLED;
}
igbuio_pci_irqhandler函数不做任何处理,然后到uio的中断里面去调用uio_event_notify.处理。
应用层OPen这个uio设备,然后通过poll的方式陷入内核,进入uio的poll驱动,使线程挂起,
然后在设备的uio中断处理函数里面去uio_event_notify.