第九章 Linux设备驱动中的异步通知和异步IO

文章介绍了异步通知的概念,强调其在设备I/O处理中的作用,通过信号实现进程间的异步通信。在Linux中,使用F_SETOWN和F_SETFLIO控制命令配合signal()函数处理设备释放的信号。文章还提到了驱动程序中的fasync()函数和kill_fasync()函数的关键作用。此外,文章对比了异步通知与异步I/O,说明了异步I/O允许应用在发起请求后立即返回并后续查询或等待回调。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

9.1 异步通知的概念和作用

  • 异步通知:设备通知用户自身可以访问,之后用户再进行I/O处理。一旦设备就绪,则主动通知应用程序。(类似于中断)
  • 阻塞、非阻塞IO、异步通知的区别:

9.2 Linux异步通知编程

  • 信号可以进行进程间通信(IPC),Linux中使用信号实现异步通知。除SIGSTOP(19) 和 SIGKILL(9) 以外,进程可以忽略或者捕获其他全部信号。
  • 用户程序中,使用signal() 函数进行信号的捕捉,来设置对应的信号处理函数:

    第一个参数为信号的值(宏),第二个参数为信号处理函数。(类似于中断注册)
  • 应用程序中处理一个设备释放的信号步骤:
    1. 通过F_SETOWN  IO控制命令设置设备文件的拥有者为本进程
    2. 通过F_SETFL  IO控制命令设置设备文件以支持FASYNC,即异步通知方式
    3. 通过signal() 连接信号和信号处理函数
  • 驱动程序所涉及的工作:
    1. 支持F_SETOWN命令,能在这个控制命令中设置filp->f_owner为对应进程ID(内核已进行处理,驱动无需再管)
    2. 支持F_SETEL命令的处理,当FASYNC标志改变时,驱动程序中fasync()函数得以执行,因此在驱动中需要实现fasync()函数
    3. 在设备资源可获得时,调用kill_fasync()函数激发相应的信号。
  • 对应关系:
  • 编程要点:一项数据结构和两个函数:
    1. 数据结构:fasync_struct 结构体(放在设备结构体中)
    2. 两个函数:
      1. 处理FASYNC标志变更的函数:int fasync_helper(int fd, struct file *filp, int mode, struct fasync_struct **fa);
      2. 释放信号用的函数(将信号发送给应用层):void kill_fasync(struct fasync_struct **fa, int sig, int band);

9.3 异步通知编程

  • 异步通知编程示例:

9.4 异步I/O

  • 异步I/O:应用可以在发起I/O请求后立刻返回,之后再查询I/O完成情况,或者I/O完成后被调回。
  • 异步I/O时序:
  • 应用程序发起I/O动作后,直接开始执行,并不等待I/O结束,它要么过一段时间来查询之前的I/O请求完成情况,要么I/O请求完成了会自动被调用与I/O完成绑定的回调函数

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值