Windows驱动第一节(什么是驱动?)

news2024/9/29 1:19:26

本文来自微软,由本人兴趣爱好人工翻译(非机翻)

What is a driver? - Windows drivers | Microsoft Learn

我想很难给驱动这个词一个准确的定义.最基础的定义是驱动是一个用于让操作系统和硬件设备通信的软件组件.

举一个例子,假设一个应用程序需要从硬件设备读取一些数据,这个应用程序会调用一些由操作系统实现的Win32 api来完成这些事情,然后win32 api会调用由驱动实现的api来从真实的硬件设备读取数据.

由同一家设计和生产真实硬件设备的厂商写的驱动程序知道如何与自家生产的硬件设备通信来拿到数据.当驱动拿到数据后 他会返回数据给操作系统,然后操作系统会返回给应用程序

Diagram that shows the application, operating system, and driver.

"驱动"这个词定义的扩展

我们目前对于驱动程序某些方面的解释实在是过于简单了,那些方面呢?

  • 并不是所有的驱动都必须由生产真实设备的厂商所写

在多数情况下,设备都是要遵循已发布的硬件标准[1].因此,驱动可以由微软来写[2],设备生产商不是必须要提供他们硬件的驱动程序.

[1] [2]:比如最常见的一个显示器设备会有HDMI物理接口 那么他就需要遵守HDMI接口的标准协议,因此对于非生产硬件设备的微软来说 开发这些标准接口的设备的驱动是可行的

  • 并不是所有的驱动程序都会直接与真实设备进行通信

对于一个发起的I/O请求(比如从某个真实硬件设备读取数据),通常会有驱动程序栈[3]中的多个驱动参与处理这个I/O请求的过程.对于驱动程序栈最简单的解释是一系列驱动程序的集合,有一个驱动在上层,而一些驱动则在下层,就如下图所示.驱动程序栈中的某些驱动有可能只是在这个过程中将I/O请求从一个格式转换为另一个格式.这些驱动程序并不会直接与真实硬件进行通信.他们只是对数据进行一些操作然后再把这些数据传递给更底层的驱动而已.

Diagram that shows application, operating system, three drivers, and a device.

 

功能驱动(Function driver):在驱动程序栈中直接与设备进行通信的驱动我们称之为功能驱动(如上图中最底层的驱动所示)

过滤驱动(Filter driver):执行辅助处理的驱动我们称之为过滤驱动

  • 有一些过滤驱动只是查看并记录这些I/O请求的相关信息并不会参与到这个处理过程中.举一个例子,一些过滤驱动只是在其中确保其他驱动能够正常的处理这些I/O请求,充当一个检验者.

基于以上几点,我们可以扩展我们对于驱动的定义,驱动只是在真实硬件和操作系统之间进行数据操作和数据过滤的一个组件.

软件驱动(software driver)

我们目前对于驱动的扩展定义已经足够合理且准确了,但是他仍然是不够完整的,因为有一些驱动完全和真实硬件设备没有任何一点关联(即发起一个I/O请求,他并不会参与到其中,而上文的过滤驱动是要参与到其中的).

举一个例子,假如你要写一个可以直接访问操作系统内核数据结构的小组件.这些内核数据结构只能被在内核运行的代码所访问(即用户模式的代码是无法访问这些内核数据结构的).你可以通过把这个小组件分成两个部分来完成功能.第一个部分运行在用户模式下并且提供用户接口,第二个部分运行在内核模式下并且拥有访问操作系统内核数据的权限.运行在用户模式下的那部分我们称之为应用(application),另一部分我们称之为软件驱动(software driver).

下图说明了两部分是如何通信的

Diagram that shows an application and a software driver.

软件驱动总是运行在内核模式中.写软件驱动的主要原因就是为了获取只能在内核模式下才能获取的操作系统收保护的数据.然而设备驱动(device driver)[即我们刚刚提到的功能驱动和过滤驱动]并不总是需要访问内核的数据和资源.所以一些设备驱动甚至是运行在用户模式下的.

总线驱动

还有一种驱动的种类我们目前还没有提到,那就是bus driver.为了理解bus driver.你需要理解设备节点和设备树.

关于设备树,设备节点,总线驱动的信息,请参见Device Nodes and Device Stacks.

功能驱动的更多信息

我们目前对于功能驱动的解释实在是过于简单.我们说过,功能驱动就是在驱动程序栈中直接与真实硬件通信的驱动.对于直接与PCI总线连接的设备来说是正确的.PCI设备的驱动有映射了真实设备的端口和存储资源的地址.这些功能驱动通过读写这些地址来直接与硬件设备通信.

然而大多数情况,真实设备并不会直接与PCI总线连接.相反,真实设备连接到连接在PCI总线的主机总线适配器上.举个例子,USB烤面包机[对没错,就是烤面包机,在美国那边烤面包机是用USB接口来连接的]连接到主机总线适配器上(称之为USB 主机控制器),而总线适配器由连接在PCI总线上.USB烤面包机有功能驱动,USB主机控制器也有功能驱动.烤面包机的功能驱动通过发送请求到USB主机控制器的功能驱动上来与烤面包机交流[这里的意思大概就相当于一类相同的接口的真实设备会被操作系统统一管理起来,然后你要与管理他们的USB主机控制器通信从而来跟你的真实设备通信].USB主机控制器的功能驱动接着会和与烤面包机通信的USB主机控制器硬件通信.

Diagram that shows USB toaster drivers and USB host controller driver.

这一段话很绕,但是这里用白话文解释一下就是,如果不是与PCI总线直接相连的真实硬件,功能驱动并不会真正的与设备通信,而是与管理这一类接口(比如USB接口)的主机控制器通信,然后由主机控制器(软件)的功能驱动与主机控制器硬件(这是真实存在于现实的硬件)通信,最后再由主机控制器硬件与真实的USB通信.

非常绕,但是他这样设计必然有这样设计的原因,打个比方,现在由USB相连的设备太多了,所以统一管理会提高操作系统的性能.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/808466.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023河南萌新联赛第(三)场:郑州大学 A - 发工资咯

2023河南萌新联赛第(三)场:郑州大学 A - 发工资咯 时间限制:C/C 2秒,其他语言4秒 空间限制:C/C 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 一个公司有n个人,每个月都…

C++类与对象 - 3(拷贝构造函数和运算符重载)(超详细)

C类与对象 - 3 1. 拷贝构造函数1.1 概念1.2 特征 2. 赋值运算符重载2.1 运算符重载2.2 赋值运算符重载记点2.3 前置和后置重载 3. const成员函数记点 4. 取地址及const取地址操作符重载 1. 拷贝构造函数 1.1 概念 在现实生活中,可能存在一个与你一样的自己&#x…

RK3566 android代码编译

一、搭建环境 所用的ubuntu系统之前已编译过linux代码,所以只需安装编译android所需的环境。 安装jdk-8 如果之前系统没有安装则执行以下命令安装: sudo apt-get install openjdk-8-jdk 查看当前系统是否有jdk-8 $ sudo update-alternatives --conf…

奇舞周刊第 501 期:前端打包加个性能插件检测~ 性能不过关就发邮件告诉领导!...

记得点击文章末尾的“ 阅读原文 ”查看哟~ 下面先一起看下本期周刊 摘要 吧~ 奇舞推荐 ■ ■ ■ 前端打包加个性能插件检测~ 性能不过关就发邮件告诉领导! 本文作者结合 Lighthouse 是一个开源的自动化工具,给组内的项目都在 CICD 流程上更新上了性能守卫…

每日一博 - How To Improve API Performance

文章目录 包括但局限于以下措施1. 采用分页显示2. 异步记录日志3. 利用缓存技术4. 实施负载压缩5. 管理数据库连接池 包括但局限于以下措施 1. 采用分页显示 当查询结果过多时,将结果分为多个页面进行显示,可以有效地提高系统的响应速度。这样&#xff…

高效率,38V最大输入单电感同步升/降稳压器SYV939C

SYV939是一种高压同步降压-升压转换器。该器件工作在4V至28V的宽输入电压范围内,具有10max平均电感电流能力。四个集成的低RDS(ON)开关最大限度地减少了传导损耗。 SYV939c包括完整的保护功能,如输出过流/短路保护,过压保护和热停机&#xff…

找到刀郎《罗刹海市》--微信小程序调用地图--【小程序花园】

微信目录集链接在此: 详细解析黑马微信小程序视频–【思维导图知识范围】难度★✰✰✰✰ 不会导入/打开小程序的看这里:参考 让别人的小程序长成自己的样子-更换window上下颜色–【浅入深出系列001】 文章目录 本系列校训学习资源的选择地图在小程序里…

数据库的下一个变革方向——云原生数据库

快速上手亚马逊云原生数据库 数据库免费试用及在线大会 亚马逊数据库产品支持免费试用,并且提供上手教程。【数据库免费试用&上手教程】 回看人类历史上每一次技术的跨越,生产力变革永远不会缺席。“云原生数据库”也已经悄然走到了第十个年头。未…

RabbitMQ 教程 | 客户端开发向导

👨🏻‍💻 热爱摄影的程序员 👨🏻‍🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻‍🏫 一位高冷无情的编码爱好者 大家好,我是 DevO…

后台管理系统中常见的三栏布局总结:使用element ui构建

vue2 使用 el-menu构建的列表布局&#xff1a; 列表可以折叠展开 <template><div class"home"><header><el-button type"primary" click"handleClick">切换</el-button></header><div class"conte…

Arcgis画等高线

目录 数据准备绘制等高线3D等高线 今天我们将学习如何在ArcGIS中绘制等高线地图。等高线地图是地理信息系统中常见的数据表现形式&#xff0c;它通过等高线将地形起伏展现得一目了然&#xff0c;不仅美观&#xff0c;还能提供重要的地形信息。 数据准备 在开始之前&#xff0c…

【javaSE】 类和对象详解

目录 面向对象的初步认知 什么是面向对象 面向对象与面向过程 类定义和使用 简单认识类 类的定义格式 注意事项 练习定义类 定义一个狗类 定义一个学生类 注意事项 类的实例化 什么是实例化 注意事项 类和对象的说明 this引用 为什么要有this引用 什么是this引…

FSM:Full Surround Monodepth from Multiple Cameras

参考代码&#xff1a;None 介绍 深度估计任务作为基础环境感知任务&#xff0c;在基础上构建的3D感知才能更加准确&#xff0c;并且泛化能力更强。单目的自监督深度估计已经有MonoDepth、ManyDepth这些经典深度估计模型了&#xff0c;而这篇文章是对多目自监督深度估计进行探…

实用科研网站(自用)

网站网址Papers With Codehttps://paperswithcode.com/AMinerhttps://www.aminer.cn/Connected Papershttps://www.connectedpapers.com/ Papers With Code Papers With Code&#xff0c;在这个网站上可以看到最新的机器学习信息&#xff0c;如&#xff1a;当前研究热点、趋势…

matplotlib从起点出发(6)_Tutorial_6_Animations

1 在matplotlib中使用动画 基于其绘图功能&#xff0c;matplotlib还提供了一个使用动画模块生成动画animation的接口。动画是一系列帧&#xff0c;其中每个帧对应于图形Figure 上的一个绘图。本教程介绍了有关如何创建此类动画的一般准则以及可用的不同选项。 import matplot…

ubuntu23.04 flush DNS caches

如何在Ubuntu 23.04中刷新DNS缓存 现在&#xff0c;如果你运行的是Ubuntu 23.04&#xff0c;"系统解决 "的方法将不再适用于你。让我们检查一下你目前的缓存大小。打开你的Ubuntu终端&#xff0c;运行以下command&#xff1a; resolvectl statistics现在&#xff0c…

Android NDK开发

工程目录图 NDK中文官网 请点击下面工程名称&#xff0c;跳转到代码的仓库页面&#xff0c;将工程 下载下来 Demo Code 里有详细的注释 代码&#xff1a;TestNDK 参考文献 Android NDK 从入门到精通&#xff08;汇总篇&#xff09;Android JNI(一)——NDK与JNI基础Android之…

宝塔面板Django项目部署(无数据库版)

近日在学习使用宝塔面板部署Django开发的web项目&#xff0c;走了不少弯路花了3天的时间才完成下面的文字&#xff0c;希望这篇文字能给正在摸索中的人带去点帮助。 一、安装宝塔面板 打开宝塔面板的官方网站(https://www.bt.cn/new/index.html).点击" " 会看到: 当…

C++笔记之vector的reserve()和capacity()用法

C笔记之vector的reserve()和capacity()用法 code review! 代码 #include <vector> #include <iostream>int main() {std::vector<int> myVector;std::cout << "Current size: " << myVector.size() << std::endl;std::cout …

记录每日LeetCode 141.环形链表 Java实现

题目描述&#xff1a; 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链…