Linux设备驱动程序第三版学习(8)- 高级字符驱动程序操作(续3)- 异步通知

第六章:高级字符驱动程序操作(续3)
以下为第四部分:异步通知

使用poll轮询方式的时候,相当于应用程序在需要的时候询问设备“准备好了吗?”,如果有这样一种情况,一个进程在低优先级正在执行长的循环计算,但又需要“尽可能快”的处理输入数据,如果采用poll的方式,那么需要这个应用程序周期性的调用poll来检测数据,也就是周期性的询问设备“准备好了吗?” 显然这种情况下poll并不是最佳的方法。更好的方法应该是一旦设备准备好了就发出一个“我准备好了”的信号给应用程序,然后应用程序再去处理。这样显然更高效。这种方法就是:异步通知。
通过上面的描述,显然如果想要异步通知,首先设备就要有发信号的功能,这就要启动文件的异步通知机制。为了启动这个机制,用户程序需要进行两个步骤:
1.指定一个进程作为文件的owner(“所有者”或者“属主”),用来接收“我准备好了”这个信号。该进程的ID好被保存到filp->f_owner中。通过调用fcntl执行F_SETOWN来完成这一步。
2.在设备中设置FASYNC标志来真正启动异步通知机制。通过调用fcntl执行F_SETFL命令完成这一步。
执行完这两个步骤以后,当有新数据到达时设备文件会发送一个SIGIO信号(“我准备好了”),该信号被发送到存放在file->f_owner中的进程。
注:显然进程如果只接受到“我准备好了”这个信号,它就会问“那个‘我’是谁阿?”(突然想起《鬼子来了》,淡定...),所以如果有多于一个文件可以异步通知输入的进程,那么当应用程序接收到信号时还是要借助poll轮询一次,以便真正确定输入的来源。

下面分别从驱动程序角度和应用程序角度分别总结一下我们应该进行哪些工作。
一、 驱动方面:
1. 在设备抽象的数据结构中增加一个struct fasync_struct的指针
2. 实现设备操作中的fasync函数,其主体就是调用内核的fasync_helper函数。
3. 在需要向用户空间通知的地方(例如scullpipe的write中)调用内核的kill_fasync函数。
4. 在驱动的release方法中调用前面定义的fasync函数, 例如scull_p_fasync(-1, filp, 0);
看一下驱动方面的源码:
    //对应上边的第1步
     
    //对应上面的第2步
     
    
    //对应上面的第3步,由于新数据是由于进程调用了write而产生的,所以在这里发送SIGIO信号
 
    
    //对应上面第4步
   

二、 应用层方面
1. 利用signal或者sigaction设置SIGIO信号的处理函数,关于signal的使用参照本博客转载的一篇“signal”
2. fcntl的F_SETOWN指令设置当前进程为设备文件owner
3. fcntl的F_SETFL指令设置FASYNC标志
看一下应用层方面的源代码,来自asynctest.c文件
   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内容简介 《LINUX设备驱动程序(第3版)》已针对Linux内核的2610版本彻底更新过了。内核的这个版本针对常见任务完成了合理化设计及相应的简化,如即插即用、利用sysfs文件系统和用户空间交互,以及标准总线上的多设备管理等等。要阅读并理解本书,您不必首先成为内核黑客;只要您理解C语言并具有Unix系统调用的一些背景知识即可。您将学到如何为字符设备、块设备和网络接口编写驱动程序。为此,《LINUX设备驱动程序(第3版)》提供了完整的示例程序,您不需要特殊的硬件即可编译和运行这些示例程序。《LINUX设备驱动程序(第3版)》还在单独的章节中讲述了PCI、USB和tty(终端)子系统。对期望了解操作系统内部工作原理的读者来讲,《LINUX设备驱动程序(第3版)》也深入阐述了地址空间、异步事件以及I/O等方面的内容。 作者简介 作者:(美)科波特 译者:魏永明 耿岳 钟书毅 Jonahan Corbet早在1981年就开始接触BSD Unix的源代码。那时,科罗拉多大学的一名讲师让他“修正”其中的分页算法。从那时起直到现在。他深入研究了他所遇到的每一个系统,其中包括VAX、Sun、Arden以及x86系统的驱动程序。他在1993年第一次接触Linux系统,从此以后一直从事Linux的开发。Corbet先生是《Linux Weekly News》的创始人和执行主编。他和妻子及两个孩子生活在科罗多州的玻尔得市。 目录 ch00.前言 ch01.第一章 设备驱动程序简介 设备驱动程序的作用 内核功能划分 设备和模块的分类 安全问题 版本编号 许可证条款 加入内核开发社团 本书概要 ch02.第二章 构造和运行模块 设置测试系统 Hello world模块 核心模块与应用程序的对比 编译和装载 内核符号表 预备知识 初始化和关闭 模块参数 在用户空间编写驱动程序 快速参考 ch03.第三章 字符设备驱动程序 scull的设计 主设备号和次设备号 一些重要的数据结构 字符设备的注册 open和release scull的内存使用 read和write 试试新设备 快速参考 ch04.第四章 调试技术 内核中的调试支持 通过打印调试 通过查询调试 通过监视调试 调试系统故障 调试器和相关工具 ch05.第五章 并发和竞态 scull的缺陷 并发及其管理 信号量和互斥体 completiOn 自旋锁 锁陷阱 除了锁之外的办法 快速参考 ch06.第六章 高级字符驱动程序操作 ioctl 阻塞型I/O poll和select 异步通知 定位设备 设备文件的访问控制 快速参考 ch07.第七章 时间、延迟及延缓操作 度量时间差 获取当前时间 延迟执行 内核定时器 tasklet 工作队列 快速参考 ch08.第八章 分配内存 kmalloc函数的内幕 后备高速缓存 get—free—page和相关函数 vmalloc及其辅助函数 per-CPU变量 获取大的缓冲区 快速参考 ch09... ch10... ... ch18...
LINUX设备驱动第三版_ 前言 第一章 设备驱动程序简介 设备驱动程序的作用 内核功能划分 设备和模块的分类 安全问题 版本编号 许可证条款 加入内核开发社团 本书概要 第二章 构造和运行模块 设置测试系统 Hello World模块 核心模块与应用程序的对比 编译和装载 内核符号表 预备知识 初始化和关闭 模块参数 在用户空间编写驱动程序 快速参考 第三章 字符设备驱动程序 scull的设计 主设备号和次设备号 一些重要的数据结构 字符设备的注册 open和release scull的内存使用 read和write 试试新设备 快速参考 第四章 调试技术 内核中的调试支持 通过打印调试 通过查询调试 通过监视调试 调试系统故障 调试器和相关工具 第五章 并发和竞态 scull的缺陷 并发及其管理 信号量和互斥体 completion 自旋锁 锁陷阱 除了锁之外的办法 快速参考 第六章 高级字符驱动程序操作 ioctl 阻塞型I/O poll和select 异步通知 定位设备 设备文件的访问控制 快速参考 第七章 时间、延迟及延缓操作 度量时间差 获取当前时间 延迟执行 内核定时器 tasklet 工作队列 快速参考 第八章 分配内存 kmalloc函数的内幕 后备高速缓存 get_free_page和相关函数 vmalloc及其辅助函数 per-CPU变量 获取大的缓冲区 快速参考 第九章 与硬件通信 I/O端口和I/O内存 使用I/O端口 I/O端口示例 使用I/O内存 快速参考 第十章 中断处理 准备并口 安装中断处理例程 实现中断处理例程 顶半部和底半部 中断共享 中断驱动的I/O 快速参考 第十一章 内核的数据类型 使用标准C语言类型 为数据项分配确定的空间大小 接口特定的类型 其他有关移植性的问题 链表 快速参考 第十二章 PCI驱动程序 PCI接口 ISA回顾 PC/104和PC/104+ 其他的PC总线 SBus NuBus 外部总线 快速参考 第十三章 USB驱动程序 USB设备基础 USB和Sysfs USB urb 编写USB驱动程序 不使用urb的USB传输 快速参考 第十四章 Linux设备模型 kobject、kset和子系统 低层sysfs操作 热插拔事件的产生 总线、设备驱动程序 类 各环节的整合 热插拔 处理固件 快速索引 第十五章 内存映射和DMA Linux的内存管理 mmap设备操作 执行直接I/O访问 直接内存访问 快速参考 第十六章 块设备驱动程序 注册 块设备操作 请求处理 其他一些细节 快速参考 第十七章 网络驱动程序 snull设计 连接到内核 net_device结构细节 打开和关闭 数据包传输 数据包的接收 中断处理例程 不使用接收中断 链路状态的改变 套接字缓冲区 MAC 地址解析 定制 ioctl 命令 统计信息 组播 其他知识点详解 快速参考 第十八章 TTY驱动程序 小型TTY驱动程序 tty_driver函数指针 TTY线路设置 ioctls proc和sysfs对TTY设备的处理 tty_driver结构详解 tty_operations结构详解 tty_struct结构详解 快速参考 参考书目 9112405-1_o.jpg (85.53 KB, 下载次数: 50)
### 回答1: 《Linux设备驱动程序 第三版》是一本针对Linux设备驱动程序开发的专业书籍。该书详细介绍了Linux下常见的设备驱动程序开发技术,包括字符设备、块设备和网络设备等方面。这本书主要面向Linux系统内核开发领域的工程师、软件开发人员、嵌入式系统开发者和设备驱动程序编写者等,也适合对Linux设备驱动程序开发感兴趣的读者使用。 《Linux设备驱动程序 第三版》共分为14章,涵盖了设备驱动的基本知识、字符设备驱动程序、块设备驱动程序、内存映射、中断、高级字符驱动程序、USB驱动程序、串行通讯、网络接口卡驱动程序、媒体网关控制协议、显示屏驱动程序、电源管理、高级驱动程序等方面。每一章的内容非常详细,涵盖了理论知识和例子,并且还提供了配套的示例代码,方便读者进行实践操作。 这本书的重点在于教授读者如何使用Linux内核框架编写驱动程序,如何开发Linux设备驱动程序,以及如何与设备进行交互。同时,还详细介绍了内核数据结构和编程规范、编译驱动程序等技术,使读者更加深入了解Linux设备驱动程序的开发过程。 总之,《Linux设备驱动程序 第三版》是一本非常优秀的Linux设备驱动程序开发教程,书中内容涵盖面广,基本知识详细介绍,适合初学者和进阶者使用。读者通过学习本书,可以更好地掌握Linux设备驱动程序的开发技术,提高自身的技术水平。 ### 回答2: 《Linux设备驱动程序第三版PDF,是一本深入介绍Linux驱动程序开发的经典著作之一。本书主要介绍了Linux设备驱动程序的编写和调试方法,以及Linux内核的一些基本特性。 本书首先介绍了Linux内核框架和设备驱动模型,包括字符设备、块设备和网络接口设备等。接着,本书深入分析了设备驱动程序的结构和实现,详细介绍了内核的I/O系统、中断处理、定时器、内存管理、锁等基本特性,以及与硬件相关的总线、中断控制器、DMA等。此外,本书还介绍了如何使用ioctl和procfs接口,以及注册和使用内核模块等典型应用场景。 总体来说,这本书深入浅出,详细介绍了Linux设备驱动程序的开发与调试方法,为读者提供了全面了解内核和驱动开发的实战指南,是Linux驱动程序开发者必不可少的参考读物。 ### 回答3: 《Linux设备驱动程序 第三版 pdf》是一本介绍Linux设备驱动程序方面的经典教材,其内容包括了Linux设备驱动程序的开发、编写以及调试等相关知识。这本教材适合那些想要理解和开发嵌入式操作系统和设备驱动程序的程序员和工程师们。 该教材主要分为三部分,第一部分介绍了驱动程序的基础知识,包括设备文件、设备驱动程序机制、字符设备以及模块加载和卸载等内容;第二部分则介绍了高级设备驱动程序的开发,如块设备、网络设备以及USB设备驱动程序等;最后一部分则介绍了调试和测试驱动程序的方法和工具。 该教材有以下几个亮点:一是该教材的内容严谨,通俗易懂;二是该教材使用的代码清晰简单,易于理解和实践;三是该教材不仅仅局限于硬件设备的驱动,还涉及了Linux内核模块的编写、网络驱动的开发等内容。同时,该教材也提供了大量的实例代码和案例,可以帮助读者更好地理解和掌握Linux设备驱动程序的开发和调试。 总之,《Linux设备驱动程序 第三版 pdf》是一本非常优秀的Linux设备驱动程序教材,不仅适合于嵌入式开发工程师,也适合于Linux内核爱好者学习和参考。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值