android 快速启动 hibernate,快速启动与休眠唤醒的区分

快速启动与休眠唤醒的区分

05/10/2021

本文内容

Windows 有三种启动模式:

冷 (传统)

从休眠唤醒

快速 (合并了前两个,在 Windows 8)

为了区分快速启动与从休眠唤醒,内核模式设备驱动程序可以检查系统电源 IRP。

在冷启动期间,启动加载程序通过将 Windows 内核文件的各个部分加载到内存中并链接它们来构造内核内存映像。 接下来,内核配置核心系统函数,枚举附加到计算机的设备,并加载这些函数的驱动程序。

相比之下,快速启动只是将休眠文件 (Hiberfil.sys) 内存中。 快速启动往往比冷启动要少得多。

为了区分快速启动与从休眠唤醒,驱动程序可以检查系统集电源 (IRP _ MN _ SET _ POWER) IRP 中的信息,以通知驱动程序计算机已进入 S0 (工作) 状态。 驱动程序在此 IRP 中的 I/O 堆栈 位置包含 Power 成员,该成员是包含电源相关信息的结构。 从 Windows Vista 开始 ,Power 成员结构包含 SystemPowerStateContext 成员,它是一个 SYSTEM POWER STATE _ _ _ CONTEXT 结构,其中包含有关以前的系统电源状态的信息。 此信息在 SYSTEM POWER STATE _ _ _ CONTEXT 结构的位字段中进行编码。

SYSTEM _ POWER STATE _ _ CONTEXT 结构中的大多数位字段保留供系统使用,对驱动程序是不透明的。 但是,此结构包含两个位字段 :TargetSystemState 和 EffectiveSystemState, 驱动程序可以读取这些字段,以确定是发生快速启动还是从休眠唤醒。

TargetSystemState 和 EffectiveSystemState 位域设置为 系统 _ 电源 _ 状态枚举值。 如果 TargetSystemState = PowerSystemHibernate 和 EffectiveSystemState = PowerSystemHibernate,则会发生从休眠状态唤醒。

但是,如果 TargetSystemState = PowerSystemShutdown 和 EffectiveSystemState = PowerSystemHibernate,则会快速启动。

TargetSystemState 位域指定上次系统电源状态转换,驱动程序将在计算机关闭或进入休眠状态之前接收到系统电源 IRP。 " EffectiveSystemState 位" 字段指示该设备的以前的有效先前系统电源状态,如用户所示。 例如,如果驱动程序收到挂起的系统转换到休眠状态的通知,但随后发生了混合关闭,则 TargetSystemState 和 EffectiveSystemState 值可能不匹配。

准备快速启动

若要为快速启动做好准备,Windows 会执行完整的关闭序列并保存休眠文件。

首先,与完全关闭一样,Windows 会关闭所有应用程序并记录所有用户会话。 在此阶段,没有运行任何应用程序,但已加载 Windows 内核,并且系统会话正在运行。

接下来,电源管理器会将系统电源 Irp 发送到设备驱动程序,告诉他们准备设备进入休眠状态。

最后,Windows 将 (包含已加载的内核模式驱动程序) 中的内核内存映像保存 Hiberfil.sys 并关闭计算机。

如果设备的驱动程序配置设备的方式不同,具体取决于是否发生冷启动或唤醒,此驱动程序应在快速启动后,将设备配置为 "冷启动"。 例如,系统提供的 NDIS 驱动程序在快速启动时禁用微型端口唤醒功能,但在从休眠唤醒时禁用此功能。

/** * YDL_Hibernate概要 <br/> * (一)支持功能: 1.自动建表,支持属性来自继承类:可根据注解自动完成建表,并且对于继承类中的注解字段也支持自动建表. 2.自动支持增删改 * ,增改支持对象化操作:增删改是数据库操作的最基本单元,不用重复写这些增删改的代码,并且添加和更新支持类似于hibernate中的对象化操作. * 3.查询方式灵活:支持android框架提供的方式,也支持原生sql方式. * 4.查询结果对象化:对于查询结果可自动包装为实体对象,类似于hibernate框架. * 5.查询结果灵活:查询结果支持对象化,也支持结果为List<Map<String,String>>形式,这个方法在实际项目中很实用,且效率更好些. * 6.日志较详细:因为android开发不支持热部署调试,运行报错时可根据日志来定位错误,这样可以减少运行Android的次数. <br/> * (二)不足之处: <br/> * 1.id暂时只支持int类型,不支持uuid,在sqlite中不建议用uuid. * 2.现在每个方法都自己开启和关闭事务,暂时还不支持在一个事务中做多个操作然后统一提交事务. <br/> * (三)作者寄语:<br/> * 昔日有JavaScript借Java发展,今日也希望AHibernateHibernate之名发展. * 希望这个项目以后会成为开源社区的重要一员,更希望这个项目能给所有Android开发者带便利. * 欢迎访问我的博客:http://blog.csdn.net/linglongxin24, * 这里有这个框架的使用范例和源码,希望朋友们多多交流完善这个框架,共同推动中国开源事业的发展,YDL_Hibernate期待与您共创美好未来!!! */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值