在Linux驅動程式編寫過程中,非同步通知技術是一種非常重要的技術。它可以實現高效的事件處理和資料傳輸,提高系統的效能和響應速度。在本文中,我們將深入探討Linux驅動技術(四) _非同步通知技術的實現原理與相關技術。
異步通知的全稱是”信號驅動的異步IO”,通過”信號”的方式,期望獲取的資源可用時,驅動會主動通知指定的應用程序,和應用層的”信號”相對應,這裡使用的是訊號」SIGIO「。操作步驟是
整個機制的框架:
「
#」
和其他訊號一樣,應用層需要註冊一個訊號處理函數,
註冊的方式還是使用signal()或sigaction()
#此外,應用層還需要把自己加入到驅動的通知鍊錶中,加入的程式碼如下
fcntl(dev_fd,F_SETOWN,getpid()); int oflags = fcntl(dev_fd,F_GETFL); fcntl(dev_fd,F_SETFL,oflags|FASYNC); ... while(1);
完成了上面的工作,應用層的程式就可以靜待SIGIO的到來了。
#應用層註冊好了,最終的發送還是看設備驅動的處理方式,為了使設備支援異步通知機制,參照應用層的接口,驅動程式中涉及3項工作。
#為了在核心中實作上面這三個功能,驅動程式需要使用1個結構2個API,結構是struct fasync_struct,函數是fasync_helper ()和kill_fasync()
#struct fasync_struct { spinlock_t fa_lock; int magic; int fa_fd; struct fasync_struct *fa_next; /* singly linked list */ struct file *fa_file; struct rcu_head fa_rcu; };
fasync_helper()的作用是將一個fasync_struct的物件註冊進內核,應用層執行**fcntl(dev_fd,F_SETFL,oflags|FASYNC)時會回呼驅動的fops.fasync(),所以通常會將fasync_helper()放到fasync()**的實作中。
/** *fasync_helper - 将一个fasync_struct对象注册进内核 *@fd:文件描述符,由fasync传入 *@filp:file指针,由fasync传入 *@sig:信号类型,通常使用的就是SIGIO *@dev_fasync:事前准备的fasync_struct对象指针的指针 */ int fasync_helper(int fd, struct file * filp, int sig, struct fasync_struct ** dev_fasync);
下面這個API就是釋放SIGIO,依照需求的不同放到不同的位置。
/** *kill_fasync - 释放一个信号 *@dev_fasync:事前使用fasync_helper注册进内核的fasync_struct对象指针的指针 *@filp:file指针,由fasync传入 *@sig:信号类型,通常使用的就是SIGIO *@flag:标志,通常,如果资源可读用POLLIN,如果资源可写用POLLOUT */ void kill_fasync(struct fasync_struct **dev_fasync, int sig, int flag);
下面這個驅動模板針對在硬體中斷到來(資源可用)的時候向應用層發信號,實際的操作中表明資源可用的情境還有很多
static struct fasync_struct *fasync = NULL; static irqreturn_t handler(int irq, void *dev) { kill_fasync(&fasync, SIGIO, POLLIN); return IRQ_HANDLED; } static int demo_fasync(int fd, struct file *filp, int mode) { return fasync_helper(fd, filp, mode, &fasync); } struct file_operations fops = { ... .fasync = demo_fasync, ... } static int __init demo_init(void) { ... request_irq(irq, handler, IRQF_TRIGGER_RISING, "demo", NULL); ... }
总之,异步通知技术是Linux驱动程序编写过程中不可或缺的一部分。它可以实现高效的事件处理和数据传输,提高系统的性能和响应速度。希望本文能够帮助读者更好地理解Linux驱动技术(四) _异步通知技术的实现原理和相关技术。
以上是深入探討Linux驅動技術(四) _非同步通知技術的實現原理與相關技術的詳細內容。更多資訊請關注PHP中文網其他相關文章!