Surface Pro系列的用户很早就发现一个很有趣也非常实用的功能,合盖后还可以接收各种通知和邮件。这种可以媲美手机的高级特性叫做“现代待机”(Modern Standby),它实际上有了十年左右的历史,一路走来,十分艰难。伴随着它坎坷命运的是它的名字,在最初,它叫做Instant-on,Windows 8上市的时候叫做Connected Standby,后改名叫做InstantGo,在Windows 10为了包容性,改名Modern Standby(现代待机),包含Connected Standby和Disconnected Standby两种模式。对于CPU和BIOS固件工程师来说,它的名字叫做S0ix,而对于设备厂商和固件来讲,它又和RTD3(Runtime D3)紧密相关。这么多年下来,Modern Standby的普及率还很低,这和它的复杂性紧密相关。所幸随着新一代的CPU们逐渐占领市场,老旧的S3睡眠模式重要要慢慢地被扫入历史的垃圾堆中,而更多的人可以慢慢享受到Modern Standby带来的便捷与舒适中去了。所谓由俭入奢易,由奢入俭难,一旦大家尝到个中滋味,那就回不去了,这也是技术发展的魅力所在。
那么这个现代待机为什么会被发明出来?中间经历了哪些坎坷?怎么看自己的机器支持不支持它?这些问题我们今天就一起来探究一下。当然作为一个技术专栏,也会介绍一下其中的技术难点,这对理解这项技术为什么迟迟不能推广紧密相关。
缘起PC机在出现的前十几年,关注的主要是提高性能,而不是节省电力。在笔记本这种便携式设备出现后,才开始考虑如何省电,以延长电池的供电时间,这样各种省电状态被发明了出来,ACPI标准囊获了这些发明,其中包括系统级的S1、S3、S4;CPU级的C0/C1/C2/C3;设备级别的D0/D1/D3等等。
电脑一切工作的很好:笔记本暂时不用,合上盖子,进入S3状态;想要用的时候,打开盖子,在一秒钟以后,进入操作系统。动作如行云流水,比关机重开机体验好太多。这下各方都满意了,也变成了约定俗成的标准操作方法,没有任何人有疑问,直到智能手机出现在地平线上。
苹果的iPhone教育了市场,让大家看到,手机还可以这么用,这么好用!记得那时我拜访Apple总部,相熟的工程师从兜里拿出一个手机向我炫耀,说公司每个发了一个。我微微一笑,没说什么。心里想:“苹果刚做手机,能做好吗?有黑莓好吗?我口袋里的摩托罗拉表示不服!”朋友看我不以为然,立刻表演了起来,左划划,右划划。我表示这些是奇技淫巧,好麻烦!谁知道没过几年,大家都开始用起来智能手机,高通和MTK等等芯片厂商大赚特赚,这里按下不表。
另一头,Wintel两兄弟坐不住了,也要向智能手机进发。Windows CE + Intel CPU是否可以扫平他们呢?现在我们当然知道结果,可当时的人们并非没有信心,当时人们认为有一个明显的优势:可以把Wintel巨量的用户无缝导入Windows Phone市场。CPU的性能当然没有问题,但一个摆在眼前的难题是功耗。为此阉割了指令集和流水线,定制出Atom系列CPU,但问题并没有完全解决。
iPhone几乎没有任何人会关闭电话,按下电源键也只是关闭屏幕而已,重要的短信和推送的消息都会收到并提醒,人们想用手机时按一下键,屏幕立刻亮了起来,无需等待。如果谁指望胃口被养叼了的用户能够忍受某新手机,按下电源键就完全变木头,想用的时候要一秒钟以后才有反应,那一定是疯了。S3睡眠不能满足客户,但仅仅关闭屏幕,让电脑CPU进入C2或者C3,功耗又比ARM阵营高的多,此路也不通。看过我介绍C State文章的同学们应该知道,最深的C State只是让CPU内核部分进入了功耗几乎为 0的状态,而CPU的uncore/SA/NorthComplex部分则继续工作(近期的UFS改善了这点),更糟的是PCH(SouthComplex)和主板上其他的芯片也无怨无悔的全力工作并贡献自己的功耗。
ARM阵营的大部分手机待机功耗只有数毫瓦,而Wintel新样机的待机功耗高达到数百毫瓦。如何填补其中的巨大黑洞,成为了微软和英特尔工程师必须解决的问题。
解决方案为了匹敌ARM阵营的特性,Wintel一起提出了Instant On/Off(ConnectedStandby)的技术。顾名思义,这项技术要求按下电源键立刻屏幕点亮、系统可用,同时要求系统在待机状态(Standby)模式下,网络通信等必要设备必须能够唤醒设备,以保持通信通知等畅通。系统0秒启动和保持可用,要求必须是S0的开机状态,同时又要求待机功耗在数毫瓦,大致是S3的功耗,这种奇怪的组合就是所谓S0ix(最深的是S0i3)的由来了。
为了达成这个目标,从硬件到软件做了极大的改动,付出了非常多的努力。我们都知道,只是把Clock Gating住,可以降低功耗,但要达成0功耗,必须关闭电力输入,就是要Power Gating。而关闭电力,就意味着芯片里面的状态机全部复位了,粗浅的理解就是寄存器等全部清0了,要恢复可用,必须重新初始化寄存器,这就是S3回来的时候,BIOS在那个1秒钟主要干的事情。而现在又要求不能有这个1秒钟,所以寄存器内容或者说状态机状态就不能丢失,怎么做到呢?
只有靠芯片自己记住自己的状态了。芯片内部电源管理模块会按照步骤,一步步关闭芯片内部区域(S0->S0i1->S0i2->S0i3),并把寄存器/状态保存在内部的nvram中,并切断这些区域的供电,让其功耗接近0;在恢复的时候,则反着来,电脑一步步恢复寄存器。相当于做了个快照,一会再恢复回来。由于这个过程是硬件完成的,速度很快。
对芯片外部的设备来说,不需要通知的设备要进入D3cold状态,功耗为0。这一般由BIOS报告ACPI,操作GPIO来关闭设备的Power rail。对于需要唤醒的设备,必须支持一种叫做Runtime D3(RTD3)的状态,把信息offload到该设备处理,并在必须时才唤醒CPU和其他处于低功耗的设备。
对整个系统来说,是从外到内部一步步进入S0i3的状态中去的:
先是CPU/SOC外部设备进入D3cold,接下来通讯设备进入RTD3,下来是芯片组和uncore,然后是Core和GPU,最后是扫尾的电路。一步一步,中间如果谁拒绝进入低功耗状态,整个链路就会中断,回到普通的运行模式。
软件也需要调优,不能有任何软件拒绝系统进入deepest idle runtime platform state (DRIPS)。Window会通过一系列步骤才能达到最后的低功耗状态,详见参考资料1
别看这么多步骤,效果还是非常让人满意的,最终达成了和手机相同的用户体验。细心的同学可能看出来了,如果要让这个过程顺利完成,仅仅因为Windows和Intel CPU支持是不够的,必须主板,外围器件和BIOS都支持并很好的调优过,才能顺利达成,是个系统工程。
尾声我们都知道Windows Phone并没有一统江湖,反而寂寂无声了。但Connected Standby这种好技术和它带来的用户体验却不能放弃。Windows 10把它拔高成Modern Standby,并支持两种mode:
Connected Standby是待机后Wifi、network等还有效,Disconnected Standby是这些也进入D3cold了。它们和老式的S3的区别是都支持Instant On,也就是即开即用。
怎么看自己的电脑是不是支持Modern Standby呢?打开Command窗口或者PowerShell:
红框就是所谓的现代待机。显然我的机器并不支持它。
最后是一些其他的信息:
1.虽然现在只有部分笔记本支持Connected Standby,但未来台式机也会支持它。并且过一段时间S3甚至都会被淘汰。
2. S3和Connected Standby是互斥的。
电脑