Types of Device Drivers

Windows可能会有User-mode的驱动,但是我们只关注Kernel-Mode的驱动。

WDM Drivers

WDM是一种驱动模型,是比较常用的驱动模型。

WDM可以分为以下几类:

  • Bus Drivers

负责检测到连接到该总线的设备的与PnP/Power相关的事件,并且通知IO Manager, PnP Manager, Power Manager。

  • Function Drivers

负责某一具体设备的driver,是狭义上的driver。

Function Driver是唯一了解某类硬件特性,并且与这类硬件直接(通过调用HAL提供的接口)打交道的driver。

  • Filter Drivers

过滤驱动,负责修改或者补充某些特定driver的功能。

Layered Drivers


Structure of a Driver

由各种routine构成


Driver Objects and Device Objects

加载driver,会调用init routine。

对于PnP driver,新的设备plug到系统上时,driver的add device routine会被调用,此时driver可以创建一个Device Object;

对于其他driver,通常driver在init routine时调用IoCreateDevice/IoCreateDeviceSecure创建Device Object;

对于应用程序来说,它要操作的是Device,它并不知道该Device相对应的Driver。应用程序如果要操作Device,只能按照文件模型来进行操作,比如Read/Write/IOControl。

而打开文件,必须知道文件的路径,对于Device来说,它们的路径是\Device目录下,这个路径是不能被应用程序访问到的,因此需要创建软链接到\Global??目录下,这样就可以被应用程序打开了。

对于PnP设备来说,它们的路径名是动态生成的GUID表示。

Device Object与Driver Object是互相通过指针关联在一起的。

Device Object里面保存device queue,里面保存所有发送到该设备上的IRP数据包;

IO System会将Device Object的device queue中的IRP按照一定的顺序取出,连同Device Object的指针一同传递给Driver Object,由Driver调用相应的routine完成对于IRP的操作。

Opening Devices

因为底层设备对于各个用户态的进程来说,属于“临界区”资源,需要同步各个进程的访问。

所以如果是要向某个设备write数据时,最好是使用exclusive write的权限打开,这样可以阻止别的进程打开这个文件。

但是这样就把整个文件的内容都锁住了,也可以使用LockFile,可以只锁住文件的一部分,而文件的其他部分是允许其他进程访问的。

Device Drivers的更多相关文章

  1. Writing device drivers in Linux: A brief tutorial

    “Do you pine for the nice days of Minix-1.1, when men were men and wrote their own device drivers?”  ...

  2. [中英对照]Device Drivers in User Space: A Case for Network Device Driver | 用户态设备驱动: 以网卡驱动为例

    前文初步介绍了Linux用户态设备驱动,本文将介绍一个典型的案例.Again, 如对Linux用户态设备驱动程序开发感兴趣,请阅读本文,否则请飘过. Device Drivers in User Sp ...

  3. [中英对照]User-Space Device Drivers in Linux: A First Look | 初识Linux用户态设备驱动程序

    如对Linux用户态驱动程序开发有兴趣,请阅读本文,否则请飘过. User-Space Device Drivers in Linux: A First Look | 初识Linux用户态设备驱动程序 ...

  4. 【转载记录】Accessing Device Drivers from C#

    来源:http://www.drdobbs.com/cpp/accessing-device-drivers-from-c/184416423/   Device Drivers are writte ...

  5. 《Linux Device Drivers》第十二章 PCI司机——note

    一个简短的引论 它给这一章总线架构的高级概述 集中访问讨论Peripheral Component Interconnect(PCI,外围组件互连)外设内核函数 PCI公交车是最好的支持的内核总线 本 ...

  6. 《Linux Device Drivers》 第十七章 网络驱动程序——note

    基本介绍 第三类是标准的网络接口Linux设备,本章介绍的内核,其余的交互网络接口描述 网络接口,必须使用特定的内核数据结构本身注册,与外部分组交换数据线打电话时准备 经常使用的文件上的网络接口操作是 ...

  7. 《Linux Device Drivers》第十四章 Linux 设备型号

    基本介绍 2.6内核设备模型来提供的抽象叙述性描述的一般系统的结构,为了支持各种不同的任务 电源管理和系统关机 用户空间与通信 热插拔设备 设备类型 kobject.kset和子系统 kobject是 ...

  8. 《Linux Device Drivers》第十五章 内存映射和DMA——note

    简单介绍 很多类型的驱动程序编程都须要了解一些虚拟内存子系统怎样工作的知识 当遇到更为复杂.性能要求更为苛刻的子系统时,本章所讨论的内容迟早都要用到 本章的内容分成三个部分 讲述mmap系统调用的实现 ...

  9. 《Linux Device Drivers》第十六章 块设备驱动程序——note

    基本介绍 块设备驱动程序通过主传动固定大小数据的随机访问设备 Linux核心Visual块设备作为基本设备和不同的字符设备类型 Linux块设备驱动程序接口,使块设备最大限度地发挥其效用.一个问题 一 ...

随机推荐

  1. Python 进阶_OOP 面向对象编程_静态方法和类方法

    目录 目录 静态方法 类方法 使用函数修饰符来声明静态方法和类方法 静态方法 静态方法仅是类中的函数, 不需要绑定实例, 也就是说静态方法的定义不需要传入 self 参数. 静态方法不属于类的某一个实 ...

  2. apm 应用性能管理(启动优化/ 掉帧卡顿/ 耗电/ 内存泄漏等)

    APM 首先查看各个阶段耗时 : (环境变量设置 dyldPRINTSTATISTICS = 1选项,) 1. 启动优化 关键: 找到耗时的原因 t总 = t1 (premain) + t1(main ...

  3. Python中生成器和yield语句的用法详解

    Python中生成器和yield语句的用法详解 在开始课程之前,我要求学生们填写一份调查表,这个调查表反映了它们对Python中一些概念的理解情况.一些话题("if/else控制流" ...

  4. Junit简单使用

    上篇文章也说到了,接口测试我使用的是Junit框架.因为我还是刚刚接触,也还没有深入了解,主要学会了断言的使用.断言是对测试运行结果的判断,如果结果符合要求,程序就会继续执行下去.反之,如果结果和预计 ...

  5. Android深度探索-卷1第一章心得体会

     本章介绍了安卓系统移植与驱动开发的概述,安卓的系统架构有四层:1 Linux内核,2 c/c++代码库, 3 Android SDK API, 4 应用程序 在读的过程中看到了专业名词,查了查,长点 ...

  6. 转:父类私有变量是否被子类继承详细解说(答案:内存中存在,但sun公司定义为不继承)

    应作者要求,本处提供一个连接,表示对原作者版权尊重. https://blog.csdn.net/mr_duantao/article/details/50966471

  7. c#拆分字符串英文和数字(包括国外所以文字)

    先创建一个类: /// <summary> /// 字符串分析 /// </summary> interface IStringAna { /// <summary> ...

  8. ==和equal的区别

    1.“==”运算符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符. 如果一个变量指向的数据是对 ...

  9. python面试题之请谈谈.pyc文件和.py文件的不同之处

    虽然这两种文件均保存字节代码,但.pyc文件是Python文件的编译版本,它有平台无关的字节代码,因此我们可以在任何支持.pyc格式文件的平台上执行它.Python会自动生成它以优化性能(加载时间,而 ...

  10. windows修改docker的默认存放位置

    docker默认存储到c盘,我需要移动到其他盘. 参考了网上很多资料,结果要么移动不了,要么重启docker就回到c盘了. 最后参考docker的官方论坛,找到了解决方案.https://forums ...