`

【Linux 驱动】第六章 高级字符驱动程序操作----异步通知

 
阅读更多

一,概念

异步通知:一旦设备就绪,则主动通知应用程序,应用程序根本就不需要查询设备状态。(类似于中断)信号是异步的,一个进程不必通过任何操作来等待信号的到达


在linux中,异步通知是使用信号来实现的,而在linux,大概有30种信号,比如大家熟悉的ctrl+c的sigint信号,进程能够忽略或者捕获除过SIGSTOP和SIGKILL的全部信号,当信号背捕获以后,有相应的函数来处理它。


二,应用程序角度考虑

应用程序为了启用文件的异步通知机制,必须执行两个步骤:
1)指定一个进程作为文件的"属主",进程可以使用fcntl执行F_SETOWN命令(此时进程id号被保存在filp->f_owner中),目的是为了让内核知道应该通知哪个进程。
2)用户通过fcntl的F_SETFL命令设置FASYNC标志。
执行完上述两个步骤后,输入文件可以在数据到达时请求发送一个ISGIO信号(驱动程序发送),该信号发送到存放在filp->f_owner中的进程。

如下示例代码启用stdin文件的异步通知机制:
  1. signal(SIGIO,&input_handler);
  2. fcntl(STDIN_FILENO,F_SETOWN,getpid());
  3. oflags=fcntl(STDIN_FILENO,F_GETFL);
  4. fcntl(STDIN_FILENO,F_SETFL,oflags|FASYNC);

应用程序中还有两点注意:应用程序不是所有设备都支持异步通知,通常应用程序假设只有套接字和终端才有异步通知能力;如果有多个文件可以异步通知输入的进程,应用程序需要借助poll或者select来确定输入的来源(利用FD_ISSET来判断)。


三,驱动程序角度考虑

那么驱动程序如何来实现异步信号呢?

内核已经提供了很方便的函数给我们使用,为了实现异步信号,驱动程序需要做三件事情:

1)实现fasync方法:该方法也只需要做一步,调用内核提供的fasync_helper函数,如下是scullp设备提供的实现代码:

  1. staticintscull_p_fasync(intfd,struct file*filp,intmode)
  2. {
  3. struct scull_pipe*dev=filp->private_data;
  4. return fasync_helper(fd,filp,mode,&dev->async_queue);
  5. }

2)当数据到达时,需要实现异步通知,这时需要调用kill_fasync,当数据可读时,此时需要通知应用程序数据可读,如下是scullp设备提供的代码:

  1. if(dev->async_queue)
  2. kill_fasync(&dev->async_queue,SIGIO,POLL_IN);

如果是为写入提供异步信号,kill_fasync必为模式调用POLL_OUT。

3)在文件关闭时必须调用fasync方法,以便从活动的异步读取进程列表中删除该文件,所有在close方法中有如下调用:

  1. sucll_p_fasync(-1,filp,0);

四,llseeek实现

llseek方法对应lseek和llseek系统调用,该方法通过直接修改filp->f_pos执行定位操作,filp->f_pos记录的文件的读写位置,为了让lseek系统调用正确工作,read/write方法必须通过更新它们收到的偏移量参数来配合。在scull设备中的该方法实现如下:




    分享到:
    评论

    相关推荐

      Linux设备驱动程序.pdf

      第6章涉及高级字符驱动操作。本章详细讲解了ioctl接口,它用于执行设备特定的操作;阻塞I/O;poll和select机制,它们用于非阻塞I/O;异步通知机制;以及如何在设备文件上设置存取控制。 第7章讲述了时间、延时和延...

      Linux设备驱动详解第二版

      第6章 字符设备驱动 118 第7章 Linux设备驱动中的并发控制 139 第8章 Linux设备驱动中的阻塞与非阻塞I/O 161 第9章 Linux设备驱动中的异步通知与异步I/O 176 第10章 中断与时钟 193 第11章 内存与I/...

      linux设备驱动程序

      3. **高级字符驱动程序操作**:在《Linux设备驱动程序(7)-高级字符驱动程序操作2》中,会涉及更复杂的驱动程序设计,如缓冲区管理、同步机制(互斥锁、信号量等)和异步I/O等。 4. **时间、延迟及延缓操作**:在...

      linux设备驱动程序 (中文第二版)

      《Linux设备驱动程序》(中文第二版)是一本深度探讨Linux系统下设备驱动程序开发的专业书籍,对于想要深入了解Linux内核以及如何与硬件交互的开发者来说,是不可或缺的参考资料。这本书详细介绍了Linux环境下设备...

      Linux驱动程序开发第三版-英文

      《Linux驱动程序开发第三版》是一本深入探讨Linux操作系统下驱动程序开发的专业书籍。这本书针对的是有经验的程序员,特别是那些对操作系统内核机制有一定了解的开发者。在Linux系统中,驱动程序是连接硬件设备与...

      Linux驱动程序开发第三版-英文_pdf

      《Linux驱动程序开发第三版》是一本深入探讨Linux内核驱动程序编程的权威书籍,英文版为专业人士提供了广泛的参考和学习资源。这本书详尽地介绍了如何在Linux操作系统下设计、实现和调试驱动程序,是软件工程师提升...

      华清远见驱动教程

      -第6章、字符设备驱动 -第7章、Linux设备驱动中的并发控制 -第8章、Linux设备驱动中的阻塞与非阻塞IO -第9章、Linux设备驱动中的异步通知与异步IO -第10章、中断与时钟 -第11章、内存与I-O访问 -第12章、Linux字符...

      Linux设备驱动程序(中文版第三版)

      《Linux设备驱动程序》(中文版第三版)是一本深入探讨Linux系统下设备驱动程序开发的专业书籍。本书针对想要理解Linux内核工作原理以及如何编写高效、稳定的设备驱动的开发者,提供了详尽的指导和实践案例。以下是该...

      嵌入式Linux应用开发完全手册有目录2

       第6章 存储器控制  第7章 内存管理单元MMU  第8章 NANDFlash控制器  第9章 中断体系结构  第10章 系统时钟和定时器  第11章 通用异步收发器UART  第12章 I*IC接口  第13章 LCD控制器  第...

      LINUX设备驱动第三版_588及代码.rar

      第六章 高级字符驱动程序操作 ioctl 阻塞型I/O poll和select 异步通知 定位设备 设备文件的访问控制 快速参考 第七章 时间、延迟及延缓操作 度量时间差 获取当前时间 延迟执行 内核定时器 tasklet ...

      linux设备驱动程序3(英文版完整)

      高级字符驱动操作章节可能包含更复杂的主题,如多线程I/O、同步机制和设备特定的优化。 9. **Chapter 12: PCI Drivers** PCI(外围组件互连)驱动章节专注于PCI设备的驱动程序开发,包括如何探测和初始化PCI设备,...

      linux驱动开发详解(1-23章)

      第一章通常会介绍Linux驱动程序的基本概念,包括驱动的分类(字符设备驱动、块设备驱动、网络设备驱动等)、驱动程序的结构以及如何构建一个简单的驱动程序。读者将了解设备文件、设备号、驱动注册与注销等基本元素...

      Linux设备驱动程序(LDD)第三版英文PDF(附书中源码)

      《Linux设备驱动程序(LDD)第三版》是Linux内核开发者和系统工程师的必备参考书。这本书详尽地介绍了如何为Linux操作系统编写设备驱动程序,是深入理解Linux内核与硬件交互机制的重要教程。以下是对该书核心知识点的...

      嵌入式LINUX内核驱动进阶班第7天(高级字符设备驱动)

      本课程“嵌入式LINUX内核驱动进阶班第7天”专注于高级字符设备驱动的开发,这是驱动程序设计的一个重要领域。字符设备驱动主要用于处理那些数据流处理方式类似文本的硬件设备,如串口、键盘、鼠标等。 首先,理解...

    Global site tag (gtag.js) - Google Analytics