信号驱动IO
【1】信号驱动IO
应用程序:1)应用程序要捕捉SIGIO信号
signal(SIGIO, handler);
2)应用程序要指定进程为文件的属主,设置当前的文件描述为当前的调用进程
fcntl(STDIN_FILENO, F_SETOWN, getpid());
与之对应,在驱动,在struct file结构体,f_owner被设置成当前进程
3)应用程序通过fcntl函数在设备中设置FASYNC标志
oflags = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, oflags | FASYNC);
驱动: 1)支持F_SETOWN命令,能在这个控制命令处理中设置filp->f_owner为对应进程ID。
不过此项工作已由内核完成,设备驱动无须处理。
2)支持F_SETFL命令的处理,每当FASYNC标志改变时,驱动程序中的fasync()函数将得以执行。
因此,驱动中应该实现fasync()函数。
int (*fasync) (int, struct file *, int);
int fasync_helper(int fd, struct file * filp, int on, struct fasync_struct **fapp)
功能:将fd添加或删除,到异步通知队列
void kill_fasync(struct fasync_struct **fp, int sig, int band)
功能:发送信号
参数:fp 异步通知队列
sig 信号的类型
band 位掩码 POLLIN 可以读
POLLOUT 可以写
【2】Linux设备模型 platform
linux设备模型,分为三个实体:驱动,设备,总线
集成在SOC中读的设备,都可以称之为platform设备,通过总线将驱动和设备完成匹配,当向内核注册设备,通过总线匹配对应驱动程序
当内核注册驱动,通过总线匹配相对应的设备
总线:
总线可以是物理存在的,也可以是虚拟的。内核中对应的结构为struct bus_type。
struct bus_type {
const char *name; 总线名称
int (*match)(struct device *dev, struct device_driver *drv); 匹配方式
设备:
设备是连接到某条物理或者虚拟总线上的对象。可能是真正物理对象,也可能是虚拟对象。内核中对应的结构为struct device。
struct device {
struct bus_type *bus;
struct device_driver *driver; /* which driver has allocated this
驱动:
驱动是用来和设备通信的软件程序。驱动可以从设备中获取数据,也可以把相应数据发给设备进行处理。内核中对应的结构为struct devicc_driver
platform架构:
总线
struct bus_type platform_bus_type = {
.name = "platform", 总线
.dev_groups = platform_dev_groups,
.match = platform_match, 匹配方式
驱动
struct platform_driver {
int (*probe)(struct platform_device *); 回调函数,一旦设备与驱动匹配成功,调用此函数
int (*remove)(struct platform_device *); 移除函数
struct device_driver driver; 继承device_driver
const struct platform_device_id *id_table; 匹配表
};
设备
struct platform_device {
const char *name; 设备名称
int id; 设备名的后缀
struct device dev; 继承
u32 num_resources; 资源的数量
struct resource *resource; 设备资源
const struct platform_device_id *id_entry; 匹配表
};
描述硬件资源
struct resource {
resource_size_t start; 设备的起始地址
resource_size_t end; 设备的末尾地址
const char *name;
unsigned long flags; 标志位
struct resource *parent, *sibling, *child;
};
#define IORESOURCE_MEM 0x00000200
#define IORESOURCE_IRQ 0x00000400
platform驱动开发流程:
1)定义注册总线
2)定义注册设备
int platform_device_register(struct platform_device *pdev)
int platform_device_unregister(struct platform_device *pdev)
3)定义注册驱动
#define platform_driver_register(drv) \
__platform_driver_register(drv, THIS_MODULE
int __platform_driver_register(struct platform_driver *drv,
struct module *owner)
void platform_driver_unregister(struct platform_driver *drv)
信号驱动IO的更多相关文章
- 《Linux/UNIX系统编程手册》第63章 IO多路复用、信号驱动IO以及epoll
关键词:fasync_helper.kill_async.sigsuspend.sigaction.fcntl.F_SETOWN_EX.F_SETSIG.select().poll().poll_wa ...
- Linux 网络编程的5种IO模型:信号驱动IO模型
Linux 网络编程的5种IO模型:信号驱动IO模型 背景 上一讲 Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 我们讲解了多路复用等方面的知识,以及有关例程. ...
- 【网络IO系列】IO的五种模型,BIO、NIO、AIO、IO多路复用、 信号驱动IO
前言 在上一篇文章中,我们了解了操作系统中内核程序和用户程序之间的区别和联系,还提到了内核空间和用户空间,当我们需要读取一条数据的时候,首先需要发请求告诉内核,我需要什么数据,等内核准备好数据之后 , ...
- 【死磕NIO】— 阻塞IO,非阻塞IO,IO复用,信号驱动IO,异步IO,这你真的分的清楚吗?
通过上篇文章([死磕NIO]- 阻塞.非阻塞.同步.异步,傻傻分不清楚),我想你应该能够区分了什么是阻塞.非阻塞.异步.非异步了,这篇文章我们来彻底弄清楚什么是阻塞IO,非阻塞IO,IO复用,信号驱动 ...
- UDP信号驱动IO
SIGIO信号 信号驱动式I/O不适用于TCP套接字, 因为产生的信号过于频繁且不能准确判断信号产生的原因. 设置信号驱动需把sockfd的非阻塞与信号驱动属性都打开 server sockfd单独提 ...
- IO的多路复用和信号驱动
Linux为多路复用IO提供了较多的接口,有select(),pselect(),poll()的方式,继承自BSD和System V 两大派系. select模型比较简单,“轮询”检测fd_set的状 ...
- IO模型浅析-阻塞、非阻塞、IO复用、信号驱动、异步IO、同步IO
最近看到OVS用户态的代码,在接收内核态信息的时候,使用了Epoll多路复用机制,对其十分不解,于是从网上找了一些资料,学习了一下<UNIX网络变成卷1:套接字联网API>这本书对应的章节 ...
- 🍛 餐厅吃饭版理解 IO 模型:阻塞 / 非阻塞 / IO 复用 / 信号驱动 / 异步
IO 概念 一个基本的 IO,它会涉及到两个系统对象,一个是调用这个 IO 的进程对象,另一个就是系统内核 (kernel).当一个 read 操作发生时,它会经历两个阶段: 通过 read 系统调用 ...
- UNIX网络编程——信号驱动式I/O
信号驱动式I/O是指进程预先告知内核,使得当某个描述符上发生某事时,内核使用信号通知相关进程. 针对一个套接字使用信号驱动式I/O,要求进程执行以下3个步骤: 建立SIGIO信号的信号处理函数. 设置 ...
随机推荐
- Mac平台重新设置MySQL的root密码
Mac OS X - 重置 MySQL Root 密码 您是否忘记了Mac OS 的MySQL的root密码? 通过以下4步就可重新设置新密码: 1. 停止 mysql server. 通常是在 ...
- [洛谷P4841]城市规划
题目大意:求$n$个点的带标号的无向连通图的个数 题解:令$F(x)$为带标号无向连通图个数生成函数,$G(x)$为带标号无向图个数生成函数 那么$G(x) = \sum_{i=0}^{\infty} ...
- 洛谷 P2155 [SDOI2008]沙拉公主的困惑 解题报告
P2155 [SDOI2008]沙拉公主的困惑 题目描述 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为\(1\)到\(N\)的阶乘,但是,政府只发行编号与\(M!\ ...
- Heine-Borel定理
前:开始学数学..来写写理解和补充吧.. 书:M.A.Armstrong著<Basic Topology> Heine-Borel定理:实轴上闭区间是紧集. 证法(1)延伸法: 思想 闭区 ...
- C++ primer 学习笔记之容器insert
今天在做练习9.22时,始终出现segments fault.最后才发现原来是自己对“容器insert之后迭代器会失效”的理解不够透彻. 题目如下: 假定iv是一个int的vector,下面的程序存在 ...
- Git的优点
没有网络时也可以使用版本控制系统,这点svn做不到,如果你一直有网络,这个可以忽略: git由于所有版本都在本地的.git目录数据库中,因此它可以用指针随时改变指向,指向不同的版本,把它作为最新的he ...
- js函数的参数
js函数的参数: js是弱类型的编程语言,调用函数时既不在乎函数的参数,也不在意参数的类型 即便你定义的函数值接受两个参数,在调用这个函数时也未必一定要是两个参数.可以传递一个.三个甚至不传递参数,而 ...
- this bind apply call
this 是当前函数运行时所属的对象bind 是指定一个函数运行时的上下文,也就是说把这个函数的this指向绑定到相应对象上,默认的暴露在全局御中的函数this指向widow对象, 严格模式下全局的t ...
- jquery 追加元素的方法(append prepend after before 的区别)
append() 方法在被选元素的结尾插入内容. prepend() 方法在被选元素的开头插入内容. after() 方法在被选元素之后插入内容. before() 方法在被选元素之前插入内容. &l ...
- [9018_1963][IOI_1998]Picture
题目描述 N(N<5000) 张矩形的海报,照片和其他同样形状的图片贴在墙上.它们的边都是垂直的或水平的.每个矩形可以部分或者全部覆盖其他矩形.所有的矩形组成的集合的轮廓称为周长.写一个程序计算 ...