windows驱动开发-电源状态(一)

在windows设备驱动开发中,随着笔记本电脑的普及,低功耗要求的增加,设备电源状态越来越重要,和之前不一样,在以前,驱动仅仅只处理PNP的电源状态而已,现在需要处理非常多的电源状态和请求。

系统电源状态

系统电源状态将系统的功耗描述为一个整体。 操作系统支持六种系统电源状态,从 S0 (完全打开) 到 S5 (关机) 。 每种状态的区分的特征如下:

  • 电源消耗:计算机使用的功率是多少?
  • 软件恢复:操作系统从什么时间重启?
  • 硬件延迟:计算机恢复工作状态需要多长时间?
  • 系统硬件上下文 (易失性处理器寄存器、内存缓存和 RAM) 的内容:保留多少系统硬件上下文? 操作系统必须重新启动才能返回到工作状态?

状态 S0 是工作状态。 状态 S1、S2、S3 和 S4 为睡眠状态,其中计算机由于功耗降低而关闭,但保留足够的上下文以在不重启操作系统的情况下返回到工作状态。 状态 S5 是关闭或关闭状态。

当系统从关闭状态 (S5) 或任何睡眠状态 (S1-S4) 转换到 S0) 的工作状态 (时,系统将处于睡眠状态,并且当它从工作状态过渡到任何睡眠状态或关闭状态时,它将处于睡眠状态。 下图显示了可能的系统电源状态转换。

系统无法直接从另一个进入一种睡眠状态:在进入任何睡眠状态之前,它必须始终进入工作状态。 例如,系统无法从状态 S2 转换到 S4,也不能从状态 S4 转换到 S2。 它必须首先返回到 S0,然后才能进入下一个睡眠状态。 这是因为处于中间睡眠状态的系统已丢失某些操作上下文,因此它必须返回到工作状态才能还原该上下文,然后才能进行其他状态转换。

设备电源状态

设备电源状态描述计算机中设备电源状态,独立于计算机中的其他设备。 设备电源状态命名为 D0、D1、D2 和 D3。 D0 是完全打开状态,D1、D2 和 D3 是低功耗状态。 状态号与功耗成反比:编号较高的状态使用较少的功率。 从 Windows 8 开始,D3 状态分为两个子状态:D3hot 和 D3cold。

设备电源状态的特征如下:

  • 功耗:设备使用多少功率?
  • 设备上下文:设备在此状态下保留多少操作上下文?
  • 设备驱动程序行为:设备的驱动程序必须执行哪些操作才能将设备还原到完全运行状态?
  • 还原时间:将设备还原到完全运行状态需要多长时间? 大多数类型的设备的还原时间适中,从一个设备类到另一个设备类几乎没有区别。 只有少数类型的设备(如 GPU)具有非常大的硬件上下文,还原时间要长很多。
  • 唤醒功能:设备是否可以请求从此状态唤醒? 通常,如果设备可以从给定的电源状态 (例如 D2)请求唤醒,则设备也可以从任何更高功率的状态 (D1) 请求唤醒。

电源状态的确切定义特定于设备。 并非所有设备都定义所有状态;许多设备仅定义 D0 和 D3 状态。 

设备的电源状态不需要与 系统电源状态匹配。 例如,某些设备可能处于关闭 (D3) 状态,即使系统处于 系统工作状态 (S0) 。

设备的电源状态似乎与设备父总线的电源状态无关。 例如,当父主机控制器处于 D3 状态时,USB 设备可能处于 D2 (选择性挂起) 状态。 这两种状态似乎不一致,只是因为在 USB 和总线上 Dx 状态的定义不同, (通常为 USB 主机控制器连接到的 PCI 或 PCI Express) 。

请注意,某些设备能够在单个设备电源状态下使用多种不同的低功耗模式。 如果此类设备的驱动程序可以在不更改设备电源状态的情况下自动将设备从一种模式切换到另一种模式,则此类设备可以使用这些模式。 但是,一般情况下,如果两种模式之间没有用户可察觉的差异,则设备应仅使用最低功率模式。 如果低功率模式(如低速模式)对性能产生负面影响,或者对设备驱动程序以外的软件不透明,则硬件不应自动使用它。

驱动程序或电源管理器可以请求设备电源状态转换,并且所有驱动程序都必须准备好处理请求此类转换的 IRP。

与系统一样,设备可以从工作状态 (D0) 转换为 (D1、D2 或 D3) 的任何低功耗状态,以及从任何低功率状态转换为工作状态。

可以看下面的表格:

D0状态

在 D0 设备电源状态下,设备完全打开并正常运行。 在此状态下,设备驱动程序可以与设备交互以执行 I/O 操作,并且设备可以生成中断。 如果设备具有映射到内存或 I/O 地址空间的硬件寄存器,则驱动程序可以访问这些寄存器。

从Windows 8开始,设备驱动程序可以将被动级别中断服务例程 (ISR) 连接到来自设备的中断。 无论设备是否在 D0 中,设备都可以生成中断。 当处于低功率 Dx 状态时,设备可以生成一个中断,该中断充当触发器,使设备返回到 D0。 ISR 计划在设备进入 D0 后在 IRQL = PASSIVE_LEVEL 运行。 在早期版本的 Windows(包括 Windows 7)中,当设备处于 D0 以外的设备电源状态时,不得生成中断。

仅当设备驱动程序作为设备的电源策略所有者通过调用 PoRequestPowerIrp 例程启动转换时,才能从 D0 转换到低功耗 Dx 状态。 当电源管理器通过发送电源 IRP (IRP_MN_SET_POWER) 响应此调用时,设备驱动程序、总线驱动程序和平台固件通过 Windows ACPI 驱动程序 (Acpi.sys) 协作处理此 IRP 以更改设备的电源状态。

设备硬件通常监视一组内部事件,这些事件可以生成运行时中断或唤醒信号,具体取决于设备的配置方式。 驱动程序实现一个代码路径来响应中断,另一个代码路径用于响应唤醒事件。 如果中断代码路径不需要处理唤醒事件,并且唤醒代码路径不需要处理中断,则可以简化驱动程序代码。 作为最佳做法,驱动程序应将设备配置为仅在设备处于 D0 时生成中断,并且仅在设备处于低功率 Dx 状态时才生成唤醒信号。 驱动程序将设备配置为在设备退出 D0 之前生成唤醒信号,并将设备配置为在设备进入 D0 后生成中断。

D3状态

D3 是低功率设备低功率状态。 所有设备都必须支持此状态。

从 Windows 8 开始,操作系统将 D3 细分为两个单独的不同子状态 D3Hot 和 D3cold。 早期版本的 Windows 定义 D3 状态,但不定义 D3hot 和 D3cold 子状态。

尽管 Windows 8 之前的 Windows 版本未显式定义 D3hot 和 D3cold 子统计信息 D3,但这些子状态在这些早期版本的 Windows 中隐式存在。 如果设备显式处于 D3 状态,并且计算机处于 S0 系统电源状态,则设备隐式处于 D3hot 子状态。 在 D3hot 中,设备连接到电源(尽管设备可能配置为绘制低电流),并且可以检测到总线上是否存在设备。 如果设备显式处于 D3 状态,并且计算机处于低功率 Sx 状态(非 S0 状态),则设备隐式处于 D3cold 子状态。 在此隐式 D3cold 子状态中,设备可能会收到一个棘手的当前状态,但设备与计算机会有效关闭,直到发生唤醒事件。

从 Windows 8 开始,设备可以在计算机保持 S0 状态时进入和离开 D3cold 子状态。 若要支持此新行为,必须将 D3hot 和 D3cold 显式定义为 D3 的非重复子状态。

D3hot 是设备可以直接从 D0 输入的 D3 的子状态。 设备在设备驱动程序的软件控制下从 D0 转换为 D3hot。 在 D3hot 中,可以在连接到的总线上检测到设备。 设备处于 D3hot 子状态时,总线必须保持 D0 状态。 从 D3hot,设备可以返回到 D0 或输入 D3cold, 只能从 D3hot 输入 D3cold。

D3cold 是 D3 的子状态,设备在物理上连接到总线,但无法检测到总线上的设备,在 D3cold 中,以下一项或两者均属实:

  • 设备连接到的总线处于低功率状态。
  • 设备处于低功率状态,当总线驱动程序尝试在总线上检测到其状态时,设备不会做出响应。

从 D3hot 到 D3cold 的转换没有设备驱动程序交互。 相反设备驱动程序指示它在启动从 D0 到 D3hot 的转换之前是否为 D3cold 转换做好准备, 随后才可能会发生从 D3hot 到 D3cold 的转换,具体取决于所有条件是否都适合启用此转换。

例如, 使用同一电源的所有设备都在 D3hot 中,并已准备好进行 D3cold 转换。 当这些设备中的最后一个输入 D3hot 时,父总线驱动程序或 ACPI 的Filter驱动程序会关闭这些设备的电源,也就是说设备进入 D3cold。

D3cold 中的设备只能通过输入 D0 离开此子状态。 从 D3cold 到 D3hot 没有直接转换。

当计算机处于 S0 状态并且设备进入 D3hot 子状态时,设备驱动程序通常无法提前确定设备的下一次转换是 D3cold 还是 D0, 一个例外是计算机准备离开 S0 状态。 在这种情况下,下一个转换是 D3cold。

如果处于低功率 Dx 状态的设备可以触发到处于 S0 状态的计算机的唤醒信号,则当计算机处于 S0 时,无需将设备保留在 D0 中。 如果计算机位于 S0 中,并且设备处于 D0 但处于空闲状态,驱动程序可以配置设备以触发唤醒信号,然后启动设备从 D0 到此低功率 Dx 状态的转换。

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

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

相关文章

python中的self是什么

你对Python编程中的self真的了解吗? 当我们在Python编程的时候,尤其是写一个方法的时候,会自动补齐括号中的self,那么我们对它真的了解吗? Self 是什么?有什么作用? self指的是调用该函数的对象(是一个实例),首先明确的是self只有在类中的方法中才…

掌握Spring Boot核心全攻略

本文介绍的内容包括&#xff1a;Spring Boot 的 pom文件、应用入口类、开发测试热启动&#xff0c;以及 Spring Boot 的配置文件。 1 pom 文件、应用入口类 1、pom 文件介绍 具体介绍可参见以下的代码注释&#xff1a; <?xml version"1.0" encoding"UTF-8&q…

WizTree去右上角抖动图标donate

希望有能力的网友去支持一波&#xff0c;捐赠无可厚非&#xff0c;做软件费精力要点捐赠可以&#xff0c;放个按钮就好&#xff0c;10秒抖一下子&#xff0c;让我觉得有点难受&#xff0c;收起了伸往钱包的小手。 工具 resource hacker官网https://www.angusj.com/resourceha…

超强动画制作软件blender

blender中文手册&#xff1a;Blender 4.1 Manual Blender 是一款集3D建模、渲染、动画、视频编辑、音频处理、游戏设计等多功能于一体的软件。由于其开源性质&#xff0c;它拥有庞大的用户群体和活跃的开发者社区&#xff0c;这使得Blender的功能和性能得到了不断的提升和优化…

FIFO Generate IP核使用——Data Counts页详解

在Vivado IDE中&#xff0c;当看到一个用于设置数据计数选项的选项卡时&#xff0c;需要注意的是&#xff0c;尽管某些选项值可能因为当前的配置而显示为灰色&#xff08;即不可选或已禁用&#xff09;&#xff0c;但IDE中显示的有效范围值实际上是你可以选择的真实值。即使某些…

Python 植物大战僵尸

文章目录 效果图项目结构实现思路源代码 效果图 项目结构 实现思路 下面是代码的实现思路&#xff1a; 导入必要的库和模块&#xff1a;首先&#xff0c;我们导入了Python的os、time库以及pygame库&#xff0c;还有植物大战僵尸游戏中用到的各个植物和僵尸的类。 初始化游戏和…

如何在Mac上恢复格式化硬盘的数据?

“嗨&#xff0c;我格式化了我的一个Mac硬盘&#xff0c;而没有使用Time Machine备份数据。这个硬盘被未知病毒感染了&#xff0c;所以我把它格式化为出厂设置。但是&#xff0c;我忘了备份我的文件。现在&#xff0c;我想恢复格式化的硬盘驱动器并恢复我的文档&#xff0c;您能…

uni-app(优医咨询)项目实战 - 第2天

学习目标: 掌握WXML获取节点信息的用法 知道如何修改 uni-ui 扩展组件的样式 掌握 uniForm 表单验证的使用方法 能够在 uni-app 中使用自定义字体图标 一、uni-app 基础知识 uni-app 是组合了 Vue 和微信小程序的相关技术知识,要求大家同时俱备 Vue 和原生小程序的开发基础。…

8 -- JavaSE总结

目录 Java语言发展 Java基础语法 Java流程控制 Java方法 Java数组 面向对象 异常 Java常用类 集合框架 IO流 多线程 网络编程 GUI Java SE&#xff08;Java Standard Edition&#xff0c;Java标准版&#xff09;是Java技术的核心和基础&#xff0c;也是Java ME和J…

JavaScript 动态网页实例 —— 日期时间应用

前言 日期和时间也是网站设计中不可或缺的重要内容。本章基于JavaScript中Date 对象的基本概念,介绍日期和时间的各种应用。鉴于其他章节已间接涉及部分内容,本章主要介绍各类不同时钟的设计,以及各种不同形式的时间的实现,同时,还涉及日历的设计和倒计时效果的实现。 本…

BeanFactory 源码浅析

BeanFactory 功能介绍 BeanFactory 是核心容器&#xff0c;负责管理 Bean 对象 BeanFactory 接口的功能只有一个 getBean() 方法BeanFactory 的实现类&#xff08;DefaultListableBeanFactory&#xff09;包含&#xff1a;控制反转、基本的依赖注入、Bean 生命周期的各种功能…

HR招聘面试时采用的在线人才测评,主要考察求职者哪些方面?

现如今的企业招聘求职者的时候&#xff0c;考察的方面是多样化的。以往很有可能只是考察求职者的业务能力&#xff0c;目前的大多数企业为了在竞争当中拥有更多的竞争力&#xff0c;企业人才测评的时候&#xff0c;往往更青睐于考察求职者多方面的能力。 对于求职者来说&#…

代码随想录算法训练营DAY48|C++动态规划Part9|121.买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III

文章目录 121.买卖股票的最佳时机思路CPP代码 122.买卖股票的最佳时机II思路CPP代码 123.买卖股票的最佳时机III思路CPP代码 121.买卖股票的最佳时机 力扣题目链接 文章讲解&#xff1a;121.买卖股票的最佳时机 视频讲解&#xff1a;动态规划之 LeetCode&#xff1a;121.买卖股…

【Mac】Lightroom Classic 2024 v13.1安装教程

软件介绍 Lightroom Classic 2024是Adobe公司推出的一款专业的数字图像处理软件&#xff0c;旨在为摄影师提供强大的工具和功能&#xff0c;以管理、编辑和分享他们的照片作品。以下是Lightroom Classic 2024的主要特点和功能&#xff1a; 数字照片管理&#xff1a; 提供直观…

如何在postman上提交文件格式的数据

如何在postman上提交文件格式的数据 今天在写一个文件上传的功能接口时&#xff0c;想用postman进行提交&#xff0c;花了些时间才找到在postman提交文件格式的数据。记录一下吧&#xff01; 1.打开postman&#xff0c;选择POST提交方式&#xff0c;然后在Params那一行的Head…

求职应聘找工作,如何看待企业在线人才测评

求职者面试的过程当中&#xff0c;除了要向求职的单位展现自身的业务能力之外&#xff0c;更需要展现其他方面的优势。企业人才测评对求职者存在哪些好处&#xff1f; 可能觉得参加测评只是面试的一部分&#xff0c;但是没有测评的情况下&#xff0c;求职者很有可能很难真正全…

【C++题解】1300. 小明暑假的零花钱

问题&#xff1a;1300. 小明暑假的零花钱 类型&#xff1a;多分支结构 题目描述&#xff1a; 小明同学的妈妈在期末考试之后决定根据小明的考试成绩奖励小明不同的暑假零花钱&#xff0c;如果考试成绩在90 分以上&#xff08;包括 90 分&#xff09;&#xff0c;零花钱是成绩…

2024.5.2

List容器实现 #include <iostream> #include <list> using namespace std;int main() {list<int> l1;l1.assign(1,13);cout << *l1.begin() << endl;cout <<l1.front() << endl;l1.assign(2,78);l1.insert(l1.end(),100);l1.push_b…

导数之光:探寻机器学习中的微变奥秘

在当今这个数据驱动的时代&#xff0c;机器学习以其强大的学习和预测能力&#xff0c;成为了推动科技进步的重要力量。而在机器学习的背后&#xff0c;数学原理&#xff0c;尤其是导数的应用&#xff0c;为其提供了坚实的理论支撑。本文将详细探讨导数在机器学习中的体现&#…

人工智能|推荐系统——工业界的推荐系统之概要

以小红书为例的推荐系统的转化流程&#xff0c;用户看到内容就是曝光&#xff0c;可以点击进去&#xff0c;然后进行一些“交互”行为&#xff0c;比如评论、点赞、收藏、转发。 通常会考虑用户的一些消费指标 而从推荐系统的角度则会考虑一些北极星指标&#xff0c;也就是优化…