在Linux驱动程序编写过程中,设备阻塞/非阻塞读写是一种非常重要的技术。它可以实现高效的数据传输和事件处理,提高系统的性能和响应速度。在本文中,我们将深入探讨Linux驱动技术(五) _设备阻塞/非阻塞读写的实现原理和相关技术。

等待队列是内核中实现进程调度的一个十分重要的数据结构,其任务是维护一个链表,链表中每一个节点都是一个PCB(进程控制块),内核会将PCB挂在等待队列中的所有进程都调度为睡眠状态,直到某个唤醒的条件发生。应用层的阻塞IO与非阻塞IO的使用我已经在Linux I/O多路复用一文中讨论过了,本文主要讨论驱动中怎么实现对设备IO的阻塞与非阻塞读写。显然,实现这种与阻塞相关的机制要用到等待队列机制。本文的内核源码使用的是3.14.0版本

设备阻塞IO的实现

当我们读写设备文件的IO时,最终会回调驱动中相应的接口,而这些接口也会出现在读写设备进程的进程(内核)空间中,如果条件不满足,接口函数使进程进入睡眠状态,即使读写设备的用户进程进入了睡眠,也就是我们常说的发生了阻塞。In a word,读写设备文件阻塞的本质是驱动在驱动中实现对设备文件的阻塞,其读写的流程可概括如下:

1. 定义-初始化等待队列头

//定义等待队列头
wait_queue_head_t waitq_h;
//初始化,等待队列头
init_waitqueue_head(wait_queue_head_t *q);
 //或
//定义并初始化等待队列头
DECLARE_WAIT_Q

详解Linux驱动技术(五) _设备阻塞/非阻塞读写相关推荐

  1. Linux驱动技术(八) _并发控制技术

    为了实现对临界资源的有效管理,应用层的程序有原子变量,条件变量,信号量来控制并发,同样的问题也存在与驱动开发中,比如一个驱动同时被多个应用层程序调用,此时驱动中的全局变量会同时属于多个应用层进程的进程 ...

  2. linux sd卡驱动视频,详解linux 驱动编写(sd卡驱动)

    随着sd卡的流行,sd卡在嵌入式设备上使用的场景也越来越多.那下面我们可以看一下,linux驱动框架上是怎么处理sd卡驱动的? 1.代码目录地址 drivers/mmc 2.基本结构 从mmc的代码结 ...

  3. Linux驱动技术(四) _异步通知技术

    异步通知的全称是"信号驱动的异步IO",通过"信号"的方式,放期望获取的资源可用时,驱动会主动通知指定的应用程序,和应用层的"信号"相对应, ...

  4. Linux驱动技术(六) _内核中断

    在硬件上,中断源可以通过中断控制器向CPU提交中断,进而引发中断处理程序的执行,不过这种硬件中断体系每一种CPU都不一样,而Linux作为操作系统,需要同时支持这些中断体系,如此一来,Linux中就提 ...

  5. Linux驱动技术(一) _内存申请

    先上基础,下图是Linux的内存映射模型 每一个进程都有自己的进程空间,进程空间的0-3G是用户空间,3G-4G是内核空间 每个进程的用户空间不在同一个物理内存页,但是所有的进程的内核空间对应同样的物 ...

  6. Pixhawk(PX4)之驱动详解篇(0)_前期准备(招贤令)

    Pixhawk(PX4)之驱动详解篇(0)_前期准备(招贤令) 原创 2017年03月01日 22:58:39 标签: 开发人员 / UAV / 软件 / 硬件 一.开篇 开源精神常在!!! 谁说软件 ...

  7. Linux初始化内存盘黑屏,详解linux内存磁盘初始化技术.doc

    详解linux内存磁盘初始化技术 详解linux内存磁盘初始化技术 /5502266.html 关键词: HYPERLINK "/tag/initrd" \n _blankinit ...

  8. linux摄像头V4L2 subdev,linux 摄像头驱动 详解linux 摄像头驱动编写

    想了解详解linux 摄像头驱动编写的相关内容吗,feixiaoxing在本文为您仔细讲解linux 摄像头驱动的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:linux,摄像头驱动,下面 ...

  9. linux 查看网络流量来源_详解Linux查看实时网卡流量的几种方式

    在工作中,我们经常需要查看服务器的实时网卡流量.通常,我们会通过这几种方式查看Linux服务器的实时网卡流量. 1. sar -n DEV 1 2 sar命令包含在sysstat工具包中,提供系统的众 ...

最新文章

  1. CentOS-文件操作
  2. OpenCV的projectPoints函数用法
  3. php接收get数组数据,来自HTTP的PHP注入GET数据用作PHP数组键值
  4. Ubuntu安装特定版本安装包
  5. bzoj 1609: [Usaco2008 Feb]Eating Together麻烦的聚餐(DP)
  6. 导航 navigationbar 与 tabbar
  7. 真正解决:gpg --verify sig: 无法检查签名:找不到公钥
  8. 二叉树遍历之层次遍历算法入门详解
  9. 单片机开发软件keil4和proteus的使用教程(超详细)_☆往事随風☆的博客
  10. 【Pix4d精品教程】垂直摄影空三加密生成DOM和DSM,并按10m间距提取高程点,生成等高线
  11. 计算机主机中的硬件组成部分,电脑的硬件组成部分及其作用各是什么
  12. 网页配色网页设计常用色彩搭配表 《配色表》
  13. 全国计算机大赛导师自评,技能大赛自我评价
  14. [转]Windows Server 2012 和 System Center 2012 SP1,Virtual Machine Manager 中启用的软件定义的网络...
  15. 兰州理工大学计算机科学全国排名,兰州理工大学好吗,全国排名多少?
  16. 如何学习云计算这一文就够了!
  17. 绕圈圈面试题(Python经典编程案例)
  18. 关于关于高博3d2d程序报错的改动
  19. DM8数据库备份与恢复 DMRMAN
  20. vue2.0基于element ui 上月 本月 下月

热门文章

  1. pe启动自定义linux,详解PE启动自定义脚本
  2. 如何高效实践卡片式写作?
  3. 标准模板库STL经典书籍(必读)
  4. HBase:海量数据分布式存储系统详细介绍
  5. python的unicode编码_python unicode编码
  6. 京东科技业务调整:整合成4大中心 负责人均向李娅云汇报
  7. linux proc 目录清理_Linux下/proc目录简介
  8. 手把手教你如何配置YUM仓库
  9. php获取xml cdata_php提取cdata内容
  10. java基础到精通博客推荐(顺序)