linux内核驱动fsync机制实现图解 【百科全说】-凯发k8官方旗舰厅

腾讯视频/爱奇艺/优酷/外卖 充值4折起

在linux内核中的io模型基本分为4类:

1、同步阻塞i/o
2、同步非阻塞i/o
3、异步阻塞i/o
4、异步非阻塞i/o

同步:应用显式地通过函数访问数据,在此函数返回时就会得到结果(成功或失败)。
异步:应用会显示地通过函数提出访问或关注申请。数据到达时,硬件和驱动会通知应用,此时代码一般不在读写访问函数中,而是得到通知了再去有目的的访问数据。

阻塞:在等待数据的过程中会休眠在此处,而非阻塞即函数不休眠立即返回,可执行接下来的代码。

对于这4种机制,在《深入linux设备驱动程序内核机制》中有讲解,对于异步非阻塞i/o其实内核提供了两种实现一个是aio,另一个就是fasync。aio应该算是一个比较新的框架,较为复杂,本人没有深入的研究过,以后研究过后在写总结。对于fasync,《深入linux设备驱动程序内核机制》中有详细的讲解以及实验,在看完了这知识以后,我像往常一样,画了一个框图来梳理所有的代码关联。这个图在两个月前画好的,由于我的宝宝及工作的关系就耽搁了发布。

(上面的图片比较下, 建议下载到本地打开)

要理解内核的fasync机制,可以结合这个图和《深入linux设备驱动程序内核机制》中的讲解。我根据这个流程图,总结下我自己的认识:
首先,fasync机制是通过内核发送出的sigio信号来实现通知机制的,并不是通过休眠唤醒。
从这个角度来说,应用就必须做以下工作:
1、安装sigio信号(信号例程处理内核数据可访问的情况)
2、告诉内核所需要通知的进程id
3、设置fasync标志,内核会通过驱动调用fasync方法为以后的信号通知做准备。

在应用程序完成了相关设定后,就可以做别的事了,如果有任何问题,内核会通过sigio信号通知,应用安装的信号例程就会被调用。

而在内核空间这端,相关的驱动程序需要实现以下工作:
1、定义一个全局的struct fasync_struct指针;
2、实现file_operations中的fasync方法,基本就是调用内核的辅助函数fasync_helper。
3、在驱动某个可以获知数据可访问信息的例程中调用kill_fasync函数。

通过以上内核与应用的配合,就可以方便的使用内核异步通知机制。这种机制用起来简单,观其机制,一开始觉得挺复杂的,一旦深入将所有相关的结构体和例程整理一下就会发现,其实这个机制的实现也很清楚明了。个人一直认为对于内核的学习,首先要理清构架及数据结构间的关系。而看别人的代码分析能让你适当的理解下构架,最后关键在于自己rtfsc。所以我现在一般不再博文中分析代码,而只说构架和图解,代码需要有兴趣的朋友自己分析。

03/09 07:27
一、为什么要学习内核? 有些人要学习内核,而有些人则可以不学习它。你如果以后要从事系统研发或驱动开发的话,就要学习内核。 刚刚接触内核,主要学习内核的接口函数。不要深入的去读内核,因为你读也读不懂,内核代码庞大如野兽一般不可驾驭。 学习内核主要掌握层次学习法,即从头开始学习,一环紧扣一环。 内核学习的四步学习法:1、核心理论学习-概念与函数原型2、范例程序分析3、思维导图设计4、亲自编写代码 二、linux内核简介 1、linux体系结构 分为两部分:用户空间和内核空间 2、linux为什么要分
03/24 03:23
linux内核与根文件系统的关系 开篇题外话:对于linux初学者来说,这是一个很纠结的问题,但这也是一个很关键的问题! 一语破天机: “尽管内核是 linux 的核心,但文件却是用户与操作系统交互所采用的主要工具.这对 linux 来说尤其如此,这是因为在 unix 传统中,它使用文件 i/o 机制管理硬件设备和数据文件.” 一.什么是文件系统 文件系统指文件存在的物理空间,linux系统中每个分区都是一个文件系统,都有自己的目录层次结构. linux文件系统中的文件是数据的集合,文件系统不仅
07/21 22:22
redhat linux是目前世界上使用最多的linux操作系统。因为它具备最好的图形界面,无论是安装、配置还是使用都十分方便,而且运行稳定,因此不论是新手还是老玩家都对它有很高的评价。现在,redhat linux又出了9.0新版本,在原有的基础上又有了很大的进步。它完善了图形界面,增强了硬件的兼容性,安装起来更加得心应手,尤其增强了多媒体方面的能力——新版本的xfree 4.0.1使你能够在linux下播放多媒体文件。它还采用了openssl 128位加密技术,使你的网络通信更加安全;最新的
06/11 11:06
unix/linux内核在系统里扮演什么角色? 不仅仅是freebsd系统,每一个操作系统都有一个内核---从ms-dos、windows到高级终端大型机,但是各种系统对内核的态度不同,有些系统花费了很大精力对用户隐藏内核。不管是windows或unix系统的发行版本都有一个默认的内核,而且每次发行一个新版本时,所做的改动大部分为新设备提供了驱动支持。内核负责遥相呼应以连接到系统的设备,这也就是为什么windows需要为新的或以前不支持的设备安装驱动程序的原因,而且一般都需要重新启动系统--因为

linux内核的文件预读详解

04/03 14:26
linux文件预读算法磁盘i/o性能的发展远远滞后于cpu和内存,因而成为现代计算机系统的一个主要瓶颈。预读可以有效的减少磁盘的寻道次数和应用程序的i/o等待时间,是改进磁盘读i/o性能的重要优化手段之一。本文作者是中国科学技术大学自动化系的博士生,他在1998年开始学习linux,为了优化服务器的性能,他开始尝试改进linux kernel,并最终重写了内核的文件预读部分,这些改进被收录到linux kernel 2.6.23及其后续版本中。 从寄存器、l1/l2高速缓存、内存、闪存,到磁盘/
09/06 06:08
linux内核代码英文版构架图:

linux内核的ioctl函数学习

09/16 00:48
linux内核的概念 linux是最受欢迎的自由电脑操作系统内核。它是一个用c语言写成,符合posix标准的类unix操作系统。linux最早是由芬兰黑客 linus torvalds为尝试在英特尔x86架构上提供自由免费的类unix操作系统而开发的。该计划开始于1991年,在计划的早期有一些minix 黑客提供了协助,而今天全球无数程序员正在为该计划无偿提供帮助。 技术上说linux是一个内核。“内核”指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。一个内核不是一
09/21 10:24
我们在进行安全性监控、测试的过程中,难免会遇到这样的问题:需要部署大量基于镜像流量的安全设备,如ips,异常流量,数据库审计,流量分析等,可是交换机上可以做镜像流量的端口数量有限制,购买专业的设备又太昂贵。 本文就针对此种情况,从linux内核模块对网络数据库包进行处理,解决上述问题。 应用场景 我们在进行安全性监控、测试的过程中,难免会遇到这样的问题:需要部署大量基于镜像流量的安全设备,如ips,异常流量,数据库审计,流量分析等,可是交换机上可以做镜像流量的端口数量有限制,购买专业的设备又太昂
10/04 19:01
linux发行版本之一ubuntu 14.10幸运地赶上了linux内核更新,新内核版本号为3.16.4。 根据ubuntu开发人员的邮件显示,10月9日是14.10内核的冻结日期,那就意味着linux内核3.16.4将是ubuntu 14.10的最终核心。毕竟内核更新几乎没有什么规律可言,而且内核需要完成大量的测试后才可以推出。 ubuntu是linux发行版本之一,使用范围很广泛,一直保持着每6个月一次的更新频率,最新的ubuntu 14.10 utopic unicorn将于1
网站地图