Linux驱动技术(四) _异步通知技术
异步通知的全称是"信号驱动的异步IO",通过"信号"的方式,放期望获取的资源可用时,驱动会主动通知指定的应用程序,和应用层的"信号"相对应,这里使用的是信号"SIGIO"。操作步骤是
- 应用层程序将自己注册为接收来自设备文件的SIGIO信号的进程
- 驱动实现相应的接口,以期具有向所有注册接收这个设备驱动SIGIO信号的应用程序发SIGIO信号的能力。
- 驱动在适当的位置调用发送函数,应用程序即可接收到SIGIO信号。
整个机制的框架:
应用层接收SIGIO
和其他信号一样,应用层需要注册一个信号处理函数,
注册的方式还是使用signal()或sigaction()
此外,应用层还需要把自己加入到驱动的通知链表中,加入的代码如下
fcntl(dev_fd,F_SETOWN,getpid());
int oflags = fcntl(dev_fd,F_GETFL);
fcntl(dev_fd,F_SETFL,oflags|FASYNC);
...
while(1);
完成了上面的工作,应用层的程序就可以静待SIGIO的到来了。
驱动发送SIGIO
应用层注册好了,最终的发送还是看设备驱动的处理方式,为了使设备支持异步通知机制,参照应用层的接口,驱动程序中涉及3项工作。
- 支持F_SETOWN命令,能在这个命令中下设置filp->f_owner为对应进程的ID,这部分内核已经做了
- 支持F_SETFL,每当FASYNC标志改变时,驱动程序中的fasync()将得以执行,so,驱动中要实现fasync()。
- 当设备资源可用时,通过kill_fasync()发送SIGIO
为了在内核中实现上面这三个功能,驱动需要使用1个结构+2个API,结构是struct fasync_struct,函数是fasync_helper()和kill_fasync()
struct fasync_struct {
spinlock_t fa_lock;
int magic;
int fa_fd;
struct fasync_struct *fa_next; /* singly linked list */
struct file *fa_file;
struct rcu_head fa_rcu;
};
fasync_helper()的作用是将一个fasync_struct的对象注册进内核,应用层执行fcntl(dev_fd,F_SETFL,oflags|FASYNC)时会回调驱动的fops.fasync(),所以通常将fasync_helper()放到fasync()的实现中。
/**
*fasync_helper - 将一个fasync_struct对象注册进内核
*@fd:文件描述符,由fasync传入
*@filp:file指针,由fasync传入
*@sig:信号类型,通常使用的就是SIGIO
*@dev_fasync:事前准备的fasync_struct对象指针的指针
*/
int fasync_helper(int fd, struct file * filp, int sig, struct fasync_struct ** dev_fasync);
下面这个API就是释放SIGIO,根据需求的不同放到不同的位置。
/**
*kill_fasync - 释放一个信号
*@dev_fasync:事前使用fasync_helper注册进内核的fasync_struct对象指针的指针
*@filp:file指针,由fasync传入
*@sig:信号类型,通常使用的就是SIGIO
*@flag:标志,通常,如果资源可读用POLLIN,如果资源可写用POLLOUT
*/
void kill_fasync(struct fasync_struct **dev_fasync, int sig, int flag);
驱动模板
下面这个驱动模板针对在硬件中断到来(资源可用)的时候向应用层发信号,实际的操作中表明资源可用的情境还有很多
static struct fasync_struct *fasync = NULL;
static irqreturn_t handler(int irq, void *dev)
{
kill_fasync(&fasync, SIGIO, POLLIN);
return IRQ_HANDLED;
}
static int demo_fasync(int fd, struct file *filp, int mode)
{
return fasync_helper(fd, filp, mode, &fasync);
}
struct file_operations fops = {
...
.fasync = demo_fasync,
...
}
static int __init demo_init(void)
{
...
request_irq(irq, handler, IRQF_TRIGGER_RISING, "demo", NULL);
...
}
Linux驱动技术(四) _异步通知技术的更多相关文章
- Linux驱动技术(四) _异步通知技术【转】
转自:https://www.cnblogs.com/xiaojiang1025/p/6376561.html 异步通知的全称是"信号驱动的异步IO",通过"信号&quo ...
- linux 设备驱动与应用程序异步通知
一.异步通知机制简介 异步通知机制的意思:一旦设备准备就绪,可以主动的通知应用程序进行相应的操作,从而使得应用程序不必去查询设备的状态. 异步通知比较准确的称谓是"信号驱动的异步IO&quo ...
- 迅为4412开发板Linux驱动教程——总线_设备_驱动注册流程详解
本文转自:http://www.topeetboard.com 视频下载地址: 驱动注册:http://pan.baidu.com/s/1i34HcDB 设备注册:http://pan.baidu.c ...
- 迅为4412开发板Linux驱动教程——总线_设备_驱动注冊流程具体解释
视频下载地址: 驱动注冊:http://pan.baidu.com/s/1i34HcDB 设备注冊:http://pan.baidu.com/s/1kTlGkcR 总线_设备_驱动注冊流程具体解释 • ...
- Linux i2c子系统(四) _从i2c-s3c24xx.c看i2c控制器驱动的编写
"./drivers/i2c/busses/i2c-s3c2410.c"是3.14.0内核中三星SoC的i2c控制器驱动程序, 本文试图通过对这个程序的分析, 剥离繁复的细节, 总 ...
- Linq技术四:动态Linq技术 -- Linq.Expressions
前面介绍了Linq的三个方面应用:Linq to SQL, Linq to XML和Linq to Object,这篇介绍一下动态Linq的实现方式及应用场景. 命名空间: System.Linq; ...
- Linux设备驱动中的异步通知与异步I/O
异步通知概念: 异步通知的意识是,一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上的“中断”概念,比较准确的称谓是“信号驱动的异步IO”,信号是在软件层次 ...
- Linux驱动技术(六) _内核中断
在硬件上,中断源可以通过中断控制器向CPU提交中断,进而引发中断处理程序的执行,不过这种硬件中断体系每一种CPU都不一样,而Linux作为操作系统,需要同时支持这些中断体系,如此一来,Linux中就提 ...
- linux设备驱动归纳总结(三):7.异步通知fasync【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-62725.html linux设备驱动归纳总结(三):7.异步通知fasync xxxxxxxxxxx ...
随机推荐
- location下的属性集锦
location.protocol="http:"//即,协议 location.hostname="zhidao.baidu.com"//即,主机域名
- OC语言的特性(一)-消息传递与调用函数的表现形式
我们在初学Objective-C时,都会觉得ObjC中的消息传递和其他语言的调用函数差不多,只是在OC中,方法调用用消息传递这一概念来代替. 那么到底怎样区别OC中的消息传递与其他语言的调用函数呢. ...
- Struts2实现异步调用机制详细剖析(XML和JSON)
一.使用XML传递 1.页面展示getXML.jsp <%@ page language="java" import="java.util.*" page ...
- HUST 1371 Emergency relief
状态压缩. 每一个人所需的物品对应一个数字,统计一个每个数字有几个.每一种提供物品的状态也对应一个数字,然后暴力判断. #include<cstdio> #include<cstri ...
- 关于Java在Linux or Android平台调用.so库
Linux平台Java调用so库-JNI使用例子 android NDK开发及调用标准linux动态库.so文件 在Android项目中调用已有.so库 Android 调用.so文件 jni And ...
- 使用virsh搭建虚拟机管理环境
这里简单的说说需要安装的依赖库 1. 安装kvm centos yum install kvm ubuntu apt-get install kvm 2. 安装qemu yum install qem ...
- UVa 727 - Equation
题目大意:给一个中缀表达式,转换成后缀表达式. 这类题一直不太会,让我想就是建一棵表达式树,然后后续遍历算了,可是建树的过程实在太麻烦了.今天才看到有中缀表达式转换成后缀表达式的算法,可以用栈进行实现 ...
- 【Xilinx-Petalinux学习】-00-开始
基于自己的ZYNQ板子,在上面运行petalinux,已经搞得稳定了,之后详细记录. 现在功能:QSPI启动u-boot和kernel,vdma.tpg.osd.vtc等IP模块在Linux下的驱动, ...
- java中String相等问题
java中判断两个字符串是否相等的问题 判断两个字符串是否相等的问题.在编程中,通常比较两个字符串是否相同的表达式是"==",但在java中不能这么写.在java中,用的是eq ...
- iOS 之 二维码生成与扫描(LBXScan)
参考:https://github.com/MxABC/LBXScan 步骤如下: 1. 下载 通过参考网址进行下载. 2. 导入 导入整个LBXScan文件夹 3. 配置 在pch中加入 #impo ...
