《linux设备驱动详解》学习笔记(五)---异步通知与异步I/O

一、应用程序——信号的接收

1、自定义信号处理函数,参数为所接收的信号值

2、绑定信号与信号处理函数

3、有的设备文件须如下设置方能发送信号(如输入流文件STDIN_FILENO


设置文件拥有者为本进程

设置文件支持FASYNC异步通知模式

有的设备不需要(如键盘)


二、驱动程序——信号的发送

1、当文件属性改为FASYNC异步通知模式时,就会调用驱动程序中的fasync()操作来将设备文件添加到异步通知列表中(该操作中的fasync_helper()就是处理FASYNC标志变更的),即生成一个fasync_struct结构体并插入异步通知列表中,然后将异步结构体指针指向它

《linux设备驱动详解》学习笔记(五)---异步通知与异步I/O

2、驱动程序通过kill_fasync释放信号给应用程序,实现异步通知

3、可通过globalfifo_fasync(-1,filp,0)把异步通知结构体从异步通知列表中删除


三、AIO系列API

1intaio_read(struct aiocb *)请求一个异步读操作

2intaio_write(struct aiocb *)请求一个异步写操作

3intaio_error(struct aiocb *)确定请求状态

4ssize_taio_return(struct aiocb *)获取传输的字节数

5intaio_suspend(const struct aiocb *,int,const struct timespec*)挂起(或阻塞)调用进程

6intaio_cancel(int,struct aiocb *)取消某个请求

7intlio_listio(int,struct aiocb *,int,struct sigevent *)一次启用大量I/O操作


structaiocb{

aio_buf;

aio_fildes;

aio_nbytes;

aio_offset;

}

一个这样的结构体代表着一个I/O操作请求


四、异步通知——驱动程序

异步I/O——应用程序

1、使用信号作为AIO的通知

2、使用回调函数作为AIO的通知


五、1、在用户空间验证globalfifo的异步通知

《linux设备驱动详解》学习笔记(五)---异步通知与异步I/O

2、使用信号作为AIO的通知

《linux设备驱动详解》学习笔记(五)---异步通知与异步I/O

1)设置AIO请求

2)设置sig_act(signal和处理函数)

3)链接AIO请求和signal


3、使用回调函数作为AIO的通知

《linux设备驱动详解》学习笔记(五)---异步通知与异步I/O

1)设置AIO请求

2)链接AIO请求和回调函数


六、1/proc/sys/fs/aio-nr

异步IO请求现有数目

2/proc/sys/fs/aio-max-nr

异步IO请求最大数目


七、1、在内核中,每一个I/O请求都有对应的一个kiobc结构体

2、字符设备驱动程序中,file_operation包含3个与AIO有关的成员函数

*aio_read() *aio_write() *aio_fasync()

3、应用程序中的aio_read()aio_write()函数本身不一定完成了读写操作,只是发起初始化读和写操作


八、设备驱动中的异步I/O函数

《linux设备驱动详解》学习笔记(五)---异步通知与异步I/O


你可能感兴趣的:(linux)