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

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

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相连的设备太多了,所以统一管理会提高操作系统的性能.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

npm yarn nrm

npm 和 yarn npm和yarn都是包管理器,yarn是在2016年发布的,那时npm还处于V3时期,那时候还没有package-lock.json文件,不稳定性、安装速度慢等缺点经常会受到广大开发者吐槽。此时,yarn 诞生了。yarn 的优点&#xff0c…

ReID网络:MGN网络(1) - 概述

Start MGN 1. 序言 现代基于感知的信息中,视觉信息占了80~85%。基于视觉信息的处理和分析被应用到诸如安防、电力、汽车等领域。 以安防市场为例,早在2017年,行业咨询公司IHS Market,我国在公共和私人领域安装有摄像头约1.76亿…

redis 存储原理与数据模型

文章目录 一、redis的存储结构1.1 存储结构1.2 存储转换 二、字典(dict)实现2.1 数据结构2.2 哈希冲突2.3 扩容2.4 缩容2.5 渐进式rehash2.6 scan 命令2.7 expire机制 三、跳表(skiplist)实现3.1 理想跳表3.2 redis跳表 一、redis的存储结构 1.1 存储结构 1.2 存储转换 二、字…

QT--day2(信号与槽,多界面跳转)

第一个界面头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QIcon> //图标头文件 #include <QPushButton> //按钮类头文件QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public…

PHP数据库

PHP MySQL 连接数据库 MySQL 简介MySQL Create 免费的 MySQL 数据库通常是通过 PHP 来使用的。 连接到一个 MySQL 数据库 在您能够访问并处理数据库中的数据之前&#xff0c;您必须创建到达数据库的连接。 在 PHP 中&#xff0c;这个任务通过 mysql_connect() 函数完成。 …

Ubuntu18.04配置PX4开发环境

源文件下载 读者可以参考PX4中文维基百科&#xff0c;或者使用下面命令↓ git clone https://github.com/PX4/PX4-Autopilot.git --recursive 下载完成之后&#xff0c;执行脚本安装命令&#xff0c;PX4给我们提供了脚本安装模式 bash ./PX4-Autopilot/Tools/setup/ubuntu.sh …

【Matplotlib 绘制折线图】

使用 Matplotlib 绘制折线图 在数据可视化中&#xff0c;折线图是一种常见的图表类型&#xff0c;用于展示随着变量的变化&#xff0c;某个指标的趋势或关系。Python 的 Matplotlib 库为我们提供了方便易用的功能来绘制折线图。 绘制折线图 下面的代码展示了如何使用 Matplo…

KafKa脚本操作

所有操作位于/usr/local/kafka_2.12-3.5.1/bin。 rootubuntu2203:/usr/local/kafka_2.12-3.5.1/bin# pwd /usr/local/kafka_2.12-3.5.1/bin rootubuntu2203:/usr/local/kafka_2.12-3.5.1/bin# ls connect-distributed.sh kafka-delegation-tokens.sh kafka-mirror-mak…

GIS基础制图之地形图

数据:地理空间数据云(http://www.gscloud.cn/)下一张北京地区DEM(30m),统一用这一张来做。 晶格 工具运行窗口不贴了,因为参数设置基本上都是默认没有什么要改的 1、「3D Analyst」—「转换」—「由栅格转出」—「栅格转TIN」 2、「3D Analyst」—「转换」—「由TIN转出」—…

Chapter 8: Files | Python for Everybody 讲义笔记_En

文章目录 Python for Everybody课程简介FilesPersistenceOpening filesText files and linesReading filesSearching through a fileLetting the user choose the file nameUsing try, except, and openWriting filesDebuggingGlossary Python for Everybody Exploring Data Us…

【用Vscode实现简单的python爬虫】从安装到配置环境变量到简单爬虫以及python中pip和request,bs4安装

第一步&#xff1a;安装python包 可以默认&#xff0c;也可以选择自己想要安装的路径 第二步&#xff1a;配置python环境变量&#xff0c;找到我的电脑->属性->高级 然后将刚刚安装的路径配置到path路径下&#xff1a; 然后cmd 运行 输入python命令&#xff0c;如果出现…

redis启动失败,oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo

在redis文件夹下&#xff0c;启动redis正常。 但是加入到system后启动redis失败。 一直处于starting状态。 对比正常redis服务的配置之后&#xff0c;把redis.conf里的守护进程关掉就可以了&#xff08;但是没用system管理之前&#xff0c;直接./redis.server启动是可以的&…

TypeScript实战篇 - TS实战:花田APP的架构

目录 TS实现花田APP的聊天Node端 整体架构 项目拆分 项目的特点 模型层 所有系统都是模型的外设 模型层的优势 TS实现花田APP的聊天Node端 整体架构 项目拆分 代号&#xff1a;huatian 5个独立的npm包 huatian/ui 花田的主项目huatian/component 花田组件库huatian/…

井字棋(TicTacToe)

目录 三种游戏 习题 1. 传统设置 2. 中间的网格 三种游戏 “选15”、“井字棋”、“魔幻15”游戏本质上是同一个游戏。 function tictactoe(job) % TICTACTOE Pick15, TicTacToe, and Magic3. % % Pick15. Pick single digit numbers. Each digit can be chosen % on…

数据结构---树和二叉树

这里写目录标题 树和二叉树的定义树的定义树的基本术语线性结构和树形结构的比较二叉树的定义起因定义 案例引入前缀码编码表达式的实现二叉树的抽象类型定义 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 树和二叉树…

论文精读之BERT

目录 1.摘要&#xff08;Abstract&#xff09; 2.引言&#xff08;Introduction&#xff09;&#xff1a; 3.结论&#xff08;Conlusion&#xff09;&#xff1a; 4.BERT模型算法: 5.总结 1.摘要&#xff08;Abstract&#xff09; 与别的文章的区别是什么:BERT是用来设计去…

C语言指针详解

目录 指针是什么? 指针和指针类型 指针-整数 指针的解引用 野指针 野指针成因 如何规避野指针 指针运算 指针- 整数 指针-指针 指针的关系运算 指针和数组 二级指针 指针数组 指针数组 模拟二维数组 指针是什么? 指针理解的2个要点: 1. 指针是内存中一个…

百度文心一言接入教程-Java版

原文链接 前言 前段时间由于种种原因我的AI BOT网站停运了数天&#xff0c;后来申请了百度的文心一言和阿里的通义千问开放接口&#xff0c;文心一言的接口很快就通过了&#xff0c;但是文心一言至今杳无音讯。文心一言通过审之后&#xff0c;很快将AI BOT的AI能力接入了文心…

【Nodejs】操作mongodb数据库

1.简介 Mongoose是一个让我们可以通过Node来操作MongoDB的模块。Mongoose是一个对象文档模型(ODM)库,它对Node原生的MongoDB模块进行了进一步的优化封装&#xff0c;并提供了更多的功能。在大多数情况下&#xff0c;它被用来把结构化的模式应用到一个MongoDB集合&#xff0c;并…

【C#】async和await 续

前言 在文章《async和await》中&#xff0c;我们观察到了一下客观的规律&#xff0c;但是没有讲到本质&#xff0c;而且还遗留了一个问题: 这篇文章中&#xff0c;我们继续看看这个问题如何解决! 我们再看看之前写的代码&#xff1a; static public void TestWait2() {var t…