ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

内核异步操作

2022-07-28 22:06:47  阅读:147  来源: 互联网

标签:异步 驱动程序 App 内核 信号 操作 函数


异步

异步引入

前几章节提供的休眠-唤醒,poll机制,都需要休眠等待某个事件发生。但是在实际中,我们并不会休眠等待事件的发生,

而是采用另一种方式,等外部事件发生之后,将结果通知给我们。在程序中,就是驱动程序中的数据主动上报给App,App收到信号之后,

执行对应的动作。这种机制称为“异步机制”。

异步流程

驱动程序是如何通知到App,告知App有数据产生。驱动程序发信息给App。

发信息,有以下步骤:

发送方:驱动程序法

发什么内容:发信号

发什么信号:SIGIO

驱动怎么发信号:内核中提供发送信号

接收方:App。App需要把自己告诉驱动(PID),让驱动明确自己发消息给哪个App。

接收方动作:对应的信号处理函数。

信号与信号处理函数如何对应:App注册信号与信号处理函数。

图 1 内核信号类型

异步信号与信号处理函数关联如下所示:

图 2 信号与信号关联函数

App在执行过程中,它需要来自哪个驱动(肯定不止一个驱动)的信号?

App打开驱动程序的设备节点。

驱动程序需要发信号给哪个App(不止一个App)?

App需要把自己的PID传递给驱动程序。

App可以接受信号也可不接受信号?

可以将App的设置传递给驱动。

驱动程序要做什么?发信号。

APP设置进程ID时,驱动程序要记录下进程ID;

APP还要使能驱动程序的异步通知功能,驱动中有对应的函数:

APP打开驱动程序时,内核会创建对应的file结构体,file中有f_flags;

f_flags中有一个FASYNC位,它被设置为1时表示使能异步通知功能。

当f_flags中的FASYNC位发生变化时,驱动程序的fasync函数被调用。

发生中断时,有数据时,驱动程序调用内核辅助函数发信号。

这个辅助函数名为kill_fasync。

异步处理架构

 

 

App给SIGIO信号注册信号处理函数。App收到SIGIO信号,绑定的函数自动被调用。

App将自己的PID传递给驱动程序。调用不涉及驱动程序,记录在内核文件系统中。

调用fasync_helper函数,根据FASYNC值设置flags值

当信号发生,调用App中注册的信号处理函数。在其中可以调用read函数读取底层硬件数据。

标签:异步,驱动程序,App,内核,信号,操作,函数
来源: https://www.cnblogs.com/zhuliushun001/p/16530390.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有