从S0状态进入sleep状态的过程
2014-02-18 17:07
218 查看
从S0状态进入sleep状态的过程
ACPI规范中对wakeing 和sleeping有一个专门的章节讲述,呈现的概念包括ACPI中定义的working state和sleeping state的几种状态,同时描述各种状态之间的转换,工作状态到睡眠状态,或者睡眠状态到工作状态的转换。
主要的状态有,
global power :G0,G1,G2,G3
sleep states :S0,S1,S2,S3,S4,S5.
具体的各个状态的概念,在各个状态时系统的情况,可以参考ACPIspec,或者查阅相关资料。这里只大概列举如下:
而各种状态之间的关系和转换流程可以从如下流程图看到大概情况。
从S0状态进入Sleep状态的具体过程如下:
1、OSPM决定系统将要进入sleeping 状态。可以通过用户指定,也可以通过程序指定。比如用户要进入待机,而选择待机键。
2、OSPM调用ACPI Drvier去执行ACPI method _TTS,以指定对应的sleep状态的,此部分即以数字形式告诉机器程序,比如1、2、3、4分别对应S1、S2、S3、S4。
3、OSPM 检测所有能够唤醒系统的device,对应的找到可以唤醒系统的function和相应的支持的sleeping state。同时_PRW在每个device中指定的目标也要检测一次。
4、OSPM接着驱动所有device 进入到特定的Dx状态,如果该设备支持wake功能,则进入Dx状态。如果不支持的话,直接进入D3。
5、OSPM调用_PTS控制method,传递相应的sleeptype值。
6、OSPM保存所有其他处理器的上下文context到memory中,不包括本身处理器。
7、OSPM会将FACS table对应的唤醒向量写入到memory中。
8、OSPM执行_GTS控制method,同理,参数传递sleeptype值。
9、OSPM将PM1x_STS中的WAK_STS状态值清零。
10、OSPM保存本地处理器的上下文到memory中。
11、OSPMflush cashe,这只在进入S1、S2、S3过程中才发生。
12、OSPM使能GPE enable位,并确保所有可以wake的信号都设定好了。
13、如果是进入S4状态,可以有S4BIOS机制和System-Initial S4机制。如果是S4BIOS模式的话,OSPM将FADT中设定的S4BIOS_REQ值写入SMI_CMD端口,使进入SMI, BIOS来接管控制,系统进入S4BIOS state。
14、如果不是S4BIOS状态,OSPM则会将sleep type值写入PM1x_CNT寄存器中的SLP_TYPx位。同时使能slp_en 位。
15、此时,系统进入sleep状态,当然chipset有相关机制会检测WAK_STS位的状态,也就是检测是否有唤醒事件发生。如果有就可以唤醒系统。ACPI中也有描述相关从sleeping状态进入working状态的过程。
从S0进入S5的过程和进入其他sleeping 状态的有区分,具体如下:
1、这个步骤可以理解成和进入sleeping前两个步骤一样。OSPM调用ACPI Drvier去执行ACPI method _TTS,以指定对应的sleep状态的。
2、OSPM执行_PTS控制method,传入参数5.
3、OSPM开始准备系统各个部分进入shutdown状态,包括flush disk cache。
4、OSPM写入sleep type值到PM1x_CNT的SLP_TYPx中。并使能SLP_EN位。
5、系统开始进入Soft off状态。
ACPI规范中对wakeing 和sleeping有一个专门的章节讲述,呈现的概念包括ACPI中定义的working state和sleeping state的几种状态,同时描述各种状态之间的转换,工作状态到睡眠状态,或者睡眠状态到工作状态的转换。
主要的状态有,
global power :G0,G1,G2,G3
sleep states :S0,S1,S2,S3,S4,S5.
具体的各个状态的概念,在各个状态时系统的情况,可以参考ACPIspec,或者查阅相关资料。这里只大概列举如下:
而各种状态之间的关系和转换流程可以从如下流程图看到大概情况。
从S0状态进入Sleep状态的具体过程如下:
1、OSPM决定系统将要进入sleeping 状态。可以通过用户指定,也可以通过程序指定。比如用户要进入待机,而选择待机键。
2、OSPM调用ACPI Drvier去执行ACPI method _TTS,以指定对应的sleep状态的,此部分即以数字形式告诉机器程序,比如1、2、3、4分别对应S1、S2、S3、S4。
3、OSPM 检测所有能够唤醒系统的device,对应的找到可以唤醒系统的function和相应的支持的sleeping state。同时_PRW在每个device中指定的目标也要检测一次。
4、OSPM接着驱动所有device 进入到特定的Dx状态,如果该设备支持wake功能,则进入Dx状态。如果不支持的话,直接进入D3。
5、OSPM调用_PTS控制method,传递相应的sleeptype值。
6、OSPM保存所有其他处理器的上下文context到memory中,不包括本身处理器。
7、OSPM会将FACS table对应的唤醒向量写入到memory中。
8、OSPM执行_GTS控制method,同理,参数传递sleeptype值。
9、OSPM将PM1x_STS中的WAK_STS状态值清零。
10、OSPM保存本地处理器的上下文到memory中。
11、OSPMflush cashe,这只在进入S1、S2、S3过程中才发生。
12、OSPM使能GPE enable位,并确保所有可以wake的信号都设定好了。
13、如果是进入S4状态,可以有S4BIOS机制和System-Initial S4机制。如果是S4BIOS模式的话,OSPM将FADT中设定的S4BIOS_REQ值写入SMI_CMD端口,使进入SMI, BIOS来接管控制,系统进入S4BIOS state。
14、如果不是S4BIOS状态,OSPM则会将sleep type值写入PM1x_CNT寄存器中的SLP_TYPx位。同时使能slp_en 位。
15、此时,系统进入sleep状态,当然chipset有相关机制会检测WAK_STS位的状态,也就是检测是否有唤醒事件发生。如果有就可以唤醒系统。ACPI中也有描述相关从sleeping状态进入working状态的过程。
从S0进入S5的过程和进入其他sleeping 状态的有区分,具体如下:
1、这个步骤可以理解成和进入sleeping前两个步骤一样。OSPM调用ACPI Drvier去执行ACPI method _TTS,以指定对应的sleep状态的。
2、OSPM执行_PTS控制method,传入参数5.
3、OSPM开始准备系统各个部分进入shutdown状态,包括flush disk cache。
4、OSPM写入sleep type值到PM1x_CNT的SLP_TYPx中。并使能SLP_EN位。
5、系统开始进入Soft off状态。
相关文章推荐
- WINCE6.0+2443系统大概过10分钟进入sleep状态
- 线程进入sleep状态,如果加锁,锁不会释放,其他线程无法进入Rum.
- 线程进入disk sleep状态,gdb 无法attach
- WINCE6.0+2443系统大概过10分钟进入sleep状态
- 调试web service的问题:无法自动进入并单步执行服务器。未能调试远程过程。
- Java多线程-线程状态、sleep()、yield()、join()
- 消息 15135,级别 16,状态 8,过程 sp_addextendedproperty,第 37 行 对象无效。'dbo.Message.messageId' 不允许有扩展属性,或对象不存在。 消息 15135,级别 16,状态 8,过程 sp_addextendedproperty,第 37 行 对象无效。'dbo.Message.messageName' 不允许有扩展属性,或对象不存在。
- 从软件项目过程的无组织状态谈团队的建设
- 怎么设置Win7不待机 Win7进入待机状态会断网的解决方法
- Android系统亮屏、锁屏、屏幕解锁事件(解决部分手机亮屏后未解锁即进入resume状态)
- 长假后快速进入工作状态
- 线程进入等待状态
- 进入低功耗状态要注意的问题
- Asp.net高级调试技巧:任意访问均可进入即时调试状态
- php有点进入状态了
- 杀毒软件已经进入空前弱智与混沌状态
- 关于App进入background状态
- Vista 无法进入睡眠状态的解决方法
- iOS开发小结 - 如何控制App内屏幕是否常亮(也就是App是否进入休眠状态)
- Android中实现进入App之后检查网络状态