Linux内核开发之异步通知与异步I/O(五)
来源:互联网 发布:软文标题 知乎 编辑:程序博客网 时间:2024/06/08 18:45
“小王呢,今天开始讲AIO与设备驱动,这也是设备驱动通知与异步IO的最后一节了,下次咱们就要开始讲更高级的东西,比如中断啦,时钟等”
在Linux内核中,每个IO请求都对应一个kiocb结构体,其ki_filp成员指向对应的file指针,通过is_sync_kiocb可以判断某Kiocb时候为同步IO请求,如果非真,表示是异步IO请求。
块设备和网络设备本身就是异步的。只有字符设备驱动必须明确指出应支持AIO.需要说明的是AIO对于大多数字符设备而言都不是必须的。只有少数才需要。
在字符设备驱动程序中,file_operations包含了3个和AIO相关的函数。如下:
ssize_t (*aio_read) (struct kiocb *iocb, char *buffer, size_t count ,loff_t offset); ssize_t (*aio_write) (struct kiocb *iocb, const char *buffer, size_t count ,loff_t offset); int (*aio_fsync) (struct kiocb *iocb, int datasync);
aio_read()和aio_write()与file_operation中的read()和write()中的offset参数不同,它直接传递值,而后者传递的是指针。这两个函数本身也不一定完成读写操作,它只是发起,初始化读写操作。
下面来看看实际的代码部分:
//异步读static ssize_t xxx_aio_read(struct kiocb *iocb, char *buffer, size_t count ,loff_t offset){ return xxx_defer_op(0, iocb, buf, count, pos);}//异步写static ssize_t xxx_aio_write(struct kiocb *iocb, const char *buffer, size_t count ,loff_t offset){ return xxx_defer_op(1, iocb, (char *)buf, count, pos);}//初始化异步IOstatic int xxx_defer_op(int write, struct kiocb *iocb, char *buf, size_t count, loff_t pos){ struct async_work *async_wk; int result; //当可以访问buffer时进行复制 if(write) { result = xxx_write (iocb->ki_filp, buf, count, &pos ); } else { result = xxx_read (iocb->ki_filp, buf, count, &pos ); } //如果是同步IOCB, 立即返回状态 if(is_sync_kiocb(iocb)) return resutl; //否则,推后几us执行 async_wk = kmalloc(sizeof(*async_wk), GFP_KERNEL )); if(async_wk==NULL) return result; async_wk->aiocb = iocb; async_ wk->result = result; INIT_WORK(&async_wk->work, xxx_do_deferred_op, async_wk); schedule_delayed_work(&async_wk->work, HZ/100); return -EIOCBOUEUED;//控制权限返回给用户空间} //延迟后执行static void xxx_do_deferred_op(void *p){ struct async_work *async_wk = (struct async_work*)p; aio_complete(async_wk_iocb, async_wk->result, 0); kfree(async_wk);}
struct async_work{ struct kiocb *iocb;//kiocb结构体指针 intresult;//执行结果 struct work_struct work; //工作结构体};
在上边代码中最核心的是使用aync_work结构体将操作延迟,通过schedule_delayed_work可以调度其运行,而aio_complete的调用用于通知内核驱动程序已经完成了操作。
最后,这一大章的内容都讲完了,一连5节,小王,你好好整理整理,下次就要开始新的内容了。
0 0
- Linux内核开发之异步通知与异步I/O(五)
- Linux内核开发之异步通知与异步I/O(五)
- Linux内核开发之异步通知与异步I/O《来自linux设备开发详解》
- Linux内核开发之异步通知与异步I/O(一)
- Linux内核开发之异步通知与异步I/O(二)
- Linux内核开发之异步通知与异步I/O(三)
- Linux内核开发之异步通知与异步I/O(四)
- Linux内核开发之异步通知与异步I/O(一)
- Linux内核开发之异步通知与异步I/O(二)
- Linux内核开发之异步通知与异步I/O(三)
- Linux内核开发之异步通知与异步I/O(四)
- Linux内核开发之异步通知与异步I/O(一)
- Linux内核开发之异步通知与异步I/O_fcntl
- linux设备驱动之异步通知与异步I/O
- Linux设备驱动之阻塞I/O与异步通知
- Linux设备驱动中的异步通知与异步I/O
- linux异步通知与异步I/O笔记
- Linux设备驱动中的异步通知与异步I/O
- 黑马程序员-File类文件操作
- Linux内核开发之异步通知与异步I/O(三)
- 实践敏捷估算(1)——不仅仅是估不准的问题
- 线性表中插入元素的实现,有兴趣可以看一下
- Linux内核开发之异步通知与异步I/O(四)
- Linux内核开发之异步通知与异步I/O(五)
- Cocos2d-x:整体框架源码分析以及启动过程原理(win32)
- Java集合框架官方教程(5):集合类的同步包装器/不可变包装器
- 编程问题
- QSignalMapper类处理多信号关联同一个槽的方法(1)
- JAVA实现双向链表
- Linux内核开发之中断与时钟(一)
- 公司首席设计师推荐的视觉体验设计站点很不错
- 通过java代码使用zookeeper