Device Drivers
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的更多相关文章
- 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?” ...
- [中英对照]Device Drivers in User Space: A Case for Network Device Driver | 用户态设备驱动: 以网卡驱动为例
前文初步介绍了Linux用户态设备驱动,本文将介绍一个典型的案例.Again, 如对Linux用户态设备驱动程序开发感兴趣,请阅读本文,否则请飘过. Device Drivers in User Sp ...
- [中英对照]User-Space Device Drivers in Linux: A First Look | 初识Linux用户态设备驱动程序
如对Linux用户态驱动程序开发有兴趣,请阅读本文,否则请飘过. User-Space Device Drivers in Linux: A First Look | 初识Linux用户态设备驱动程序 ...
- 【转载记录】Accessing Device Drivers from C#
来源:http://www.drdobbs.com/cpp/accessing-device-drivers-from-c/184416423/ Device Drivers are writte ...
- 《Linux Device Drivers》第十二章 PCI司机——note
一个简短的引论 它给这一章总线架构的高级概述 集中访问讨论Peripheral Component Interconnect(PCI,外围组件互连)外设内核函数 PCI公交车是最好的支持的内核总线 本 ...
- 《Linux Device Drivers》 第十七章 网络驱动程序——note
基本介绍 第三类是标准的网络接口Linux设备,本章介绍的内核,其余的交互网络接口描述 网络接口,必须使用特定的内核数据结构本身注册,与外部分组交换数据线打电话时准备 经常使用的文件上的网络接口操作是 ...
- 《Linux Device Drivers》第十四章 Linux 设备型号
基本介绍 2.6内核设备模型来提供的抽象叙述性描述的一般系统的结构,为了支持各种不同的任务 电源管理和系统关机 用户空间与通信 热插拔设备 设备类型 kobject.kset和子系统 kobject是 ...
- 《Linux Device Drivers》第十五章 内存映射和DMA——note
简单介绍 很多类型的驱动程序编程都须要了解一些虚拟内存子系统怎样工作的知识 当遇到更为复杂.性能要求更为苛刻的子系统时,本章所讨论的内容迟早都要用到 本章的内容分成三个部分 讲述mmap系统调用的实现 ...
- 《Linux Device Drivers》第十六章 块设备驱动程序——note
基本介绍 块设备驱动程序通过主传动固定大小数据的随机访问设备 Linux核心Visual块设备作为基本设备和不同的字符设备类型 Linux块设备驱动程序接口,使块设备最大限度地发挥其效用.一个问题 一 ...
随机推荐
- javascript:void()的理解
href="javascript:void(0);"本身没有任何危害啊,表示这是一个空链接.如果想在网页上用a标签,但又不想产生页面实际跳转动作,就可以这么做.下面是一些用法对比: ...
- xshell几个常用命令以及注意事项:
xshell几个常用命令以及注意事项: cd .. 回到上级目录 cd xx 进入xx目录 rm xx 删除文件xx rm -rf 删除目录及其所包含的所有文件,高危命令,一定谨慎 mkdir xx ...
- oo_project_2java数据类型范围及测试
数据类型范围测试 一.数字常数的编译问题 java中的常量数字默认以int型编译 如: long a = 1234567890; //十位 long b = 12345678900; //默认数据为i ...
- Intellij IDEA 智能补全的 10 个姿势,简直不能太牛逼!
Java技术栈 www.javastack.cn 优秀的Java技术公众号 一年多前,栈长那时候刚从 Eclipse 转型 IDEA 成功,前面转了好多次,都是失败史,都是泪.. 后面我就在微信公众号 ...
- [已解决]报错: Could not install packages due to an EnvironmentError: [Errno 13] Permission denied: '/Users/mac/Ana
报错代码: pip3 install gerapy 报错内容: Could not install packages due to an EnvironmentError: [Errno 13] Pe ...
- 两种图片延迟加载的方法总结jquery.scrollLoading.js与jquery.lazyload.js---转载
jquery.scrollLoading方法 html <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml& ...
- 多线性方程组迭代算法——Gauss-Seidel迭代算法的Python实现
多线性方程组(张量)迭代算法的原理请看这里:原理部分请留言,不方便公开分享 Jacobi迭代算法里有详细注释:多线性方程组迭代算法——Jacobi迭代算法的Python实现 import numpy ...
- 不要62(数位dp)
题目传送门 不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 二维码相关---java生成二维码名片,而且自己主动保存到手机通讯录中...
版权声明:本文为博主原创文章,未经博主credreamer 同意不得转载 违者追究法律责任. https://blog.csdn.net/lidew521/article/details/244418 ...
- Nacos-服务注册地址为内网IP的解决办法
最近在使用Spring Cloud Alibaba这一套微服务解决方案,但是在服务注册的时候,网关死活找不到微服务地址,自己的微服务通过网关怎么也访问不到. 查找原因 仔细一查才发现,网关去访问了一个 ...