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 ...
随机推荐
- iOS所有常用证书,appID,Provisioning Profiles配置说明及制作图文教程
概述: 苹果的证书繁锁复杂,制作管理相当麻烦,今天决定重置一个游戏项目中的所有证书,做了这么多次还是感觉很纠结,索性直接记录下来,日后你我他查阅都方便: 首先得描述一下各个证书的定位,作用,这样在制作 ...
- 浅谈一个网页打开的全过程(涉及DNS、CDN、Nginx负载均衡等)
1.概要 从用户在浏览器输入域名开始,到web页面加载完毕,这是一个说复杂不复杂,说简单不简单的过程,下文暂且把这个过程称作网页加载过程.下面我将依靠自己的经验,总结一下整个过程.如有错漏,欢迎指正. ...
- 查看Linux最近重启的时间
最近实验室老是掉电,想查看服务器什么时候重启的,于是在网上找了一些资料.有两种方式可以查看服务器重启. (1) who -b (2) last reboot |head -1
- 普通项目如何转换成Maven项目 --转载自百度知道
右键普通Java项目,在弹出的菜单中选择[Configure]-[Convert to Maven Project]: 2 在弹出的对话框中输入项目的groupId, artifactId和versi ...
- PHP下的命令行执行
PHP 的命令行模式 以下是 PHP 二进制文件(即 php.exe 程序)提供的命令行模式的选项参数,您随时可以通过 PHP -h 命令来查询这些参数. Usage: php [options] [ ...
- 在PHP语言中使用JSON
目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它. 我写过一篇<数据类型和JSON格式>,探讨它的设计思想.今天,我想总结一下PHP语言对它的支持,这是开发 ...
- Jquery的AJAX应用详解
案例一:取得服务端当前时间 简单形式:jQuery对象.load(url),返回结果自动添加到jQuery对象代表的标签中间 <body> 当前时间: <span id=" ...
- Grid (read-only) objects and methods (client-side reference)获取子表单对象的一些方法 Crm 2016
https://msdn.microsoft.com/en-us/library/dn932126.aspx#BKMK_GridControl Updated: November 29, 2016 A ...
- CMake Tutorial
1.最简实例 使用cmake的最简实例是由一个源程序文件生成一个可执行文件.例如由下述C++源程序文件生成可执行文件tutorial. main.cpp #include<iostream> ...
- 一 APPIUM基本理论知识
1.APPIUM介绍 Appium 是一个自动化测试开源工具,支持 iOS 平台和 Android 平台上的原生应用,web 应用和混合应用.所谓的“移动原生应用”是指那些用 iOS SDK 或者 A ...
