1 驱动程序,操作系统,文件系统和应用程序之间的关系

字符设备和块设备映射到操作系统中的文件系统,由文件系统向上提供给应用程序统一的接口用以访问设备。

Linux把设备视为文件,称为设备文件,通过对设备文件的读写操作实现对真实外设的操作。

从驱动程序的角度来从下到上看层次结构,包含了硬件设备,设备驱动程序(中断处理程序,设备服务程序),文件系统和用户进程四个层次:

需要知道的两个概念:

设备号:

  • 主设备号:标识同一类设备,对应一个驱动程序
  • 从设备号:标识一个设备实例,从设备号使得不同的物理设备使用同一个驱动程序。

设备文件:存在硬盘上的实际存在的文件,包括设备的名字,类型,设备号

需要知道的三个关于驱动操作的数据结构:

  • file_operations:文件操作,每个进程对设备的访问都会转换为对file_operations的访问,调用里面的操作函数指针;
  • file:打开的文件
  • inode:由内核在文件系统中表示文件

2 字符设备的注册

至此,设备驱动注册完成,有相应的设备驱动程序和设备号与之对应。

3 设备的打开

设备注册完成后,可以打开一个设备,这时候调用系统调用open()函数,经过一系列的调用,最后会调用chrdev_open()函数进行实际的打开操作,其主要流程为:

设备注册打开完成后,需要对其进行各种操作,外部设备的操作有一个特点就是操作时间较长,且操作时间不确定。

处理外部设备运作时,主要有两种方式:轮询和中断。

下面主要用介绍用中断的模式等待外设完成操作,其主要流程为:

4 小结

这里简单总结了一下Linux处理外部设备的主要流程,主要包括了外部设备的注册,打开和通常的操作。

需要注意的知识点就是驱动设备模型的概念,在字符设备中位cdev。所有对设备的操作,都是在cdev的ops字段寻找处理程序,之前将cdev映射道inode的i_cedv中,cdev的ops字段映射到设备文件file的f_op字段,这样对设备文件的操作就等同于对设备的操作,这正是本文开头所说明的设备文件映射到文件系统的实质。

在外部设备的操作流程中,涉及到中断处理流程,主要指的是软中断,会在中断一章详细讨论。

参考:

Linux操作系统分析PPT:驱动程序编写基础

【Linux操作系统分析】设备驱动处理流程的更多相关文章

  1. Linux下 USB设备驱动分析(原创)

    之前做过STM32的usb HID复合设备,闲来看看linux下USB设备驱动是怎么一回事, 参考资料基于韦东山JZ2440开发板,以下,有错误欢迎指出. 1.准备知识 1.1USB相关概念: USB ...

  2. Linux和Windows设备驱动架构比较

    毕业后一直在学操作系统, 有时候觉得什么都懂了,有时候又觉得好像什么都不懂,但总体来说自认为对操作系统实现机制的了解比周围的人还是要多一些.去年曾花了几个星期的晚上时间断断续续翻译了这篇对Linux和 ...

  3. Linux的总线设备驱动模型

    裸机编写驱动比较自由,按照手册实现其功能即可,每个人写出来都有很大不同: 而Linux中还需要按照Linux的驱动模型来编写,也就是需要按照"模板"来写,写出来的驱动就比较统一. ...

  4. linux driver ------ 字符设备驱动 之 “ 创建设备节点流程 ”

    在字符设备驱动开发的入门教程中,最常见的就是用device_create()函数来创建设备节点了,但是在之后阅读内核源码的过程中却很少见device_create()的踪影了,取而代之的是device ...

  5. Linux中总线设备驱动模型及平台设备驱动实例

    本文将简要地介绍Linux总线设备驱动模型及其实现方式,并不会过多地涉及其在内核中的具体实现,最后,本文将会以平台总线为例介绍设备和驱动程序的实现过程. 目录: 一.总线设备驱动模型总体介绍及其实现方 ...

  6. Linux高级字符设备驱动

    转载:http://www.linuxidc.com/Linux/2012-05/60469p4.htm 1.什么是Poll方法,功能是什么? 2.Select系统调用(功能)      Select ...

  7. Linux实现字符设备驱动的基础步骤

    Linux应用层想要操作kernel层的API,比方想操作相关GPIO或寄存器,能够通过写一个字符设备驱动来实现. 1.先在rootfs中的 /dev/ 下生成一个字符设备.注意主设备号 和 从设备号 ...

  8. Linux中LCD设备驱动-framebuffer(帧缓冲)【】

    转自:https://blog.csdn.net/linux_devices_driver/article/details/7079442 1.framebuffer 帧缓冲     帧缓冲(fram ...

  9. Linux下usb设备驱动详解

    USB驱动分为两块,一块是USB的bus驱动,这个东西,Linux内核已经做好了,我们可以不管,我们只需要了解它的功能.形象的说,USB的bus驱动相当于铺出一条路来,让所有的信息都可以通过这条USB ...

随机推荐

  1. SSL是啥?

    SSL(Secure Socket Layer) 的主要作用是验证客户端与服务器的有效性,并在数据传输前,就进行加密,避免在传输过程中被窃取,同时亦可保证数据的完整性,确保数据在传输过程中不被篡改,以 ...

  2. websocket 通信协议

    //WEBSOKET java SERVICE http://my.oschina.net/u/590484/blog/71797 UPDATE:前些天有网友mail和我讨论websocket协议,当 ...

  3. java反编译命令javap

    1. 输出所有类和成员 javap -private XX.class 2. 输出分解后的代码 javap -c XX.class

  4. 深入理解urllib、urllib2及requests

    urllib and urllib2 区别 –博主提示:下面的是python2中的用法,python3需要做出相应修改. urllib和urllib2模块都做与请求URL相关的操作,但他们提供不同的功 ...

  5. 谷歌日志库GLog 使用说明

    1 引用头文件 加载库 #include <glog/include/logging.h> #pragma comment(lib,"libglog.lib") 2 初 ...

  6. [Ext JS 4] 布局之实战一 - 中间区块不会自动伸展 (tab)

    前言 [Ext JS 4] 布局之实战一 - 中间区块不会自动伸展 (tab) 在上一篇中,中间的tab 区块无法自动伸展的原因一句话说就是: 使用contentEL的方式,相关HTML元素不会参与组 ...

  7. STL-multimap

    转自:http://www.cnblogs.com/xiaoka/archive/2011/08/09/2132342.html multimap提供了可以一种可以有重复键值的STL map类型.其插 ...

  8. Javascript声明变量类型

    声明变量类型 当您声明新变量时,可以使用关键词 "new" 来声明其类型: var carname=new String; var x= new Number; var y= ne ...

  9. js发送post请求下载文件

    大家都知道ajax是不能直接下载文件的,所以一般都是通过一个超链接的形式去下载一个文件 但是当牵扯到需要发送很多数据到服务器上再下载的时候超链接的形式就有些太过勉强了 如下是一个工具方法(依赖jque ...

  10. 简单的web三层架构系统【第三版】

    今天是第三版,和前几天一样今天还是要对代码进行优化,三层架构是一种思想,具体能不能使得整个系统安全和高性能,还是要看代码编写的是否合理,逻辑性是否严谨. 昨天偶然间看到别人写的三层架构中,竟然没有在方 ...