当前位置: 首页 > news >正文

Windows驱动开发最新教程笔记2025(一)名词解释

什么是驱动程序?

驱动程序是一个软件组件,它允许操作系统和设备进行通信。 例如,当应用需要从设备读取数据时,它会调用操作系统实现的函数。 然后,操作系统调用驱动程序实现的函数。 驱动程序通常由设备制造商开发,知道如何与设备硬件通信以获取数据。 驱动程序获取数据后,它会将其返回给操作系统,然后操作系统将其返回给应用。

以上解释简化了驱动程序的概念。以下是一些需要关注的要点:

  • 驱动程序并不总是必须由设备的制造商开发。如果设备遵循已发布的硬件标准,则 Microsoft 可以编写驱动程序,因此设备设计人员不必提供驱动程序。

  • 并非所有驱动程序都直接与设备通信。 通常, 在驱动程序堆栈 中分层的多个驱动程序参与 I/O 请求。 将堆栈可视化的常规方法是将第一个参与对象放在顶部,将最后一个参与对象放在底部,如此图所示。 堆栈中的某些驱动程序将请求从一种格式更改为另一种格式。 这些驱动程序不直接与设备通信。 相反,他们会更改请求,并将其传递给堆栈中较低层的驱动程序。

    函数驱动程序:与设备直接通信的驱动程序称为 函数驱动程序

    筛选器驱动程序:执行辅助处理的驱动程序称为 筛选器驱动程序

  • 某些筛选器驱动程序会观察并记录有关 I/O 请求的信息,但不主动参与其中。 例如,某些筛选器驱动程序充当验证程序,以确保堆栈中的其他驱动程序正确处理 I/O 请求。

我们可以将驱动程序的定义细化为观察或参与操作系统与设备之间的通信的任何软件组件。

软件驱动程序

我们扩展的定义相当准确,但仍不完整,因为某些驱动程序根本不与任何硬件设备相关联。

例如,如果需要编写访问核心操作系统数据结构的工具,可以将该工具拆分为两个组件。 第一个组件在用户模式下运行且提供用户界面。 第二个组件在内核模式下运行,并访问核心操作系统数据。 在用户模式下运行的组件称为应用程序,在内核模式下运行的组件称为“软件驱动程序” 。 软件驱动程序不与硬件设备关联。

此图说明了与内核模式软件驱动程序通信的用户模式应用程序。

描述应用程序与软件驱动程序之间的关系的关系图。

软件驱动程序始终在内核模式下运行。 它们主要用于访问仅在内核模式下可用的受保护数据。 但是,并非所有设备驱动程序都需要访问内核模式数据和资源,因此某些设备驱动程序在用户模式下运行

总线驱动程序

另一种类型的驱动程序是 总线驱动程序。 若要了解总线驱动程序,需要了解设备节点和设备树。

函数驱动程序的详细解释

到目前为止,我们的解释过于简化 函数驱动程序的定义。 我们指出,设备的函数驱动程序是堆栈中直接与设备通信的一个驱动程序。 对于直接连接到外围组件互连 (PCI) 总线的设备来说,这是正确的。 PCI 设备的函数驱动程序会获取映射到设备上的端口和内存资源的地址。 函数驱动程序通过写入这些地址直接与设备通信。

然而,在很多情况下,设备并不直接连接到 PCI 总线。相反,设备连接到与 PCI 总线相连的主机总线适配器。例如,USB 烤面包机连接到与 PCI 总线相连的主机总线适配器(称为 USB 主机控制器)。USB 烤面包机有一个功能驱动程序,USB 主机控制器也有一个功能驱动程序。烤面包机的功能驱动程序通过向 USB 主机控制器的功能驱动程序发送请求来间接与烤面包机通信。然后,USB 主机控制器的功能驱动程序直接与 USB 主机控制器硬件通信,而后者又与烤面包机通信。

演示 USB 烤箱驱动程序、USB 主机控制器驱动程序和 PCI 总线之间交互的关系图。

用户模式和内核模式 

运行 Windows 的计算机中的处理器在两种不同的模式下运行: 用户模式 和 内核模式。 处理器根据它正在执行的代码类型在这些模式之间切换。 应用程序在用户模式下运行,而核心操作系统组件在内核模式下运行。 尽管大多数驱动程序在内核模式下运行,但也有些驱动程序可以在用户模式下运行。

用户模式

在用户模式下启动应用程序时,Windows 会为其创建一个 进程 。 此过程为应用程序提供专用 虚拟地址空间 和专用 句柄表。 由于每个应用程序的虚拟地址空间都是专用的,因此一个应用程序无法修改另一个应用程序的数据。 每个应用程序单独运行,确保如果一个应用程序崩溃,不会影响其他应用程序或操作系统。

用户模式应用程序的虚拟地址空间也受到限制。 在用户模式下运行的进程无法访问为操作系统保留的虚拟地址。 限制用户模式应用程序的虚拟地址空间可防止应用程序修改或损坏关键操作系统数据。

内核模式

在内核模式下运行的所有代码共享同一个 虚拟地址空间。 因此,内核模式驱动程序不会与其他驱动程序或操作系统隔离。 如果内核模式驱动程序错误地写入错误的虚拟地址,则可能会泄露属于操作系统或其他驱动程序的数据。 如果内核模式驱动程序崩溃,则会导致整个操作系统崩溃。

下图演示了用户模式和内核模式组件之间的通信。

显示计算机系统中用户模式和内核模式组件之间的通信的关系图。

虚拟地址空间

处理器在读取或写入内存位置时使用虚拟地址。 在这些操作期间,处理器将虚拟地址转换为物理地址。一段虚拟地址有时也称为一段“虚拟内存

用户空间和系统空间

每个用户模式进程都有其各自的专用虚拟地址空间,但在内核模式下运行的所有代码都共享称为“系统空间” 的单个虚拟地址空间。 用户模式进程的虚拟地址空间称为“用户空间” 。

在 32 位 Windows 中,可用的虚拟地址空间共计为 2^32 字节(4 GB)。 通常,较低的 2 GB 用于用户空间,而上 2 GB 用于系统空间。

说明 32 位 Windows 中总可用虚拟地址空间与用户空间和系统空间划分的关系图。

在 64 位 Windows 中,虚拟地址空间的理论大小为 2^64 字节(16 艾字节),但实际上仅使用 16 艾字节范围的一小部分。

分页缓冲池和非分页缓冲池

在用户空间中,所有物理内存页面都可以根据需要调出到磁盘文件。 在系统空间中,某些物理页面可以分页,而其他物理页面则无法分页。 系统空间具有用于动态分配内存的两个区域:分页缓冲池和非分页缓冲池。

分页缓冲池中分配的内存可以根据需要调出到磁盘文件。 非分页缓冲池中分配的内存永远无法调出到磁盘文件。

显示分页池中内存分配之间的差异的关系图。

设备节点和设备堆栈 

在 Windows 中,设备由即插即用 (PnP) 设备树中的设备节点来表示。 通常,向设备发送 I/O 请求时,一些驱动程序会帮助处理该请求。 这些驱动程序中的每一个都与一个设备对象相关联,这些设备对象在堆栈中进行排列。 设备对象的顺序与它们的关联驱动程序一起被称为设备堆栈。 每个设备节点都有自己的设备堆栈。

简单来说就是设备树中有很多设备节点,每个设备对象和一个驱动程序绑定。若干个设备节点的所有设备对象和对应的驱动程序构成了设备堆栈。

设备节点和即插即用设备树

Windows 将设备组织成一种称为即插即用设备树(简称设备树)的树形结构。通常,设备树中的节点代表一个设备或复合设备上的单个功能。然而,有些节点代表与物理设备无关的软件组件。

设备树中的节点称为设备节点。设备树的根节点称为根设备节点。按照惯例,根设备节点绘制在设备树的底部,如下图所示。

设备树展示了 PnP 环境中固有的父子关系。设备树中的多个节点表示连接有子设备的总线。例如,PCI 总线节点表示主板上的物理 PCI 总线。在启动期间,PnP 管理器会请求 PCI 总线驱动程序枚举连接到 PCI 总线的设备。这些设备由 PCI 总线节点的子节点表示。在上图中,PCI 总线节点包含多个连接到 PCI 总线的设备子节点,包括 USB 主机控制器、音频控制器和 PCI Express 端口。

连接到 PCI 总线的一些设备本身就是总线。PnP 管理器会请求每条总线枚举连接到它的设备。在上图中,我们可以看到音频控制器是一条连接有音频设备的总线。我们可以看到 PCI Express 端口是一条连接有显示适配器的总线,而显示适配器是一条连接有一台显示器的总线。

您将节点视为设备还是总线取决于您的视角。例如,您可以将显示适配器视为在准备屏幕上显示的帧方面发挥关键作用的设备。但是,您也可以将显示适配器视为能够检测和枚举所连接显示器的总线。

设备对象和设备堆栈

http://www.lqws.cn/news/504973.html

相关文章:

  • Nginx SSL/TLS协议栈中配置深度解析与实践指南-优雅草卓伊凡
  • From Tranformer to Decoder ONLY
  • 云原生周刊:Argo CD v3.1 正式发布
  • PyEcharts教程(009):PyEcharts绘制水球图
  • 【HTTP】取消已发送的请求
  • Leaflet面试题200道
  • C++修炼:智能指针
  • 自然语言处理入门
  • centos7 rpm 包升级openssh至10.0版本
  • 解码成都芯谷金融中心文化科技产业园:文化+科技双轮驱动
  • 枫清科技受邀参加2025数据智能大会
  • 如何通过nvm切换本地node环境详情教程(已装过node.js更改成nvm)
  • Vue3+el-table-v2虚拟表格大数据量多选功能详细教程
  • 字节跳动开源了一款 Deep Research 项目
  • YOLO、VOC、COCO数据集格式
  • C++中的数学计算库Eigen
  • LT8311EX一款适用于笔记本电脑,扩展坞的usb2.0高速运转芯片,成对使用,延伸长度达120米
  • EXCEL中实用的一些手段——BOM汇总查询
  • 【Datawhale组队学习202506】YOLO-Master task04 YOLO典型网络模块
  • 桥头守望者
  • 《前端资源守卫者:SRI安全防护全解析》
  • LangChain4j之会话功能AiServices工具类的使用(系列二)
  • 【WCF】单例模式的线程安全缓存管理器实现,给你的WebApi加入缓存吧
  • 【DeepSeek实战】3、Ollama实战指南:LobeChat+多网关架构打造高可用大模型集群
  • 数据赋能(319)——安全与合规——数据安全可控
  • 吉林大学软件工程期末复习整理
  • 基于大模型预测的化脓性阑尾炎诊疗方案研究报告
  • MSTP技术解析:提升网络负载均衡
  • 解决移动端播放MP4黑屏问题,PC端正常的问题
  • 华为云对象存储OBS 支持安卓/iOS/鸿蒙UTS组件