|
|
|
--易祝兵
9 w7 D, K7 x A/ K0 C, @) Z, M$ V5 `2 `你应该知道ACPI是什么东西了吧? 本小文章讲述一下软件在ACPI S3时的动作,在你看此文章之前,如果不知道这些名词。那就请close或跳到其它地方浏览
3 w% Q6 o+ d+ R
$ ?" j, p( n/ c2 [- U9 X! r。
8 D- L( v. a+ j5 |( [5 l) o4 O9 k7 \( H* w; A7 E, p# Q
前提:ACPI BIOS ACPI OS,Support S3." u% e# L. V6 E. Z5 W# @% t
; C! M, _) f4 |5 q4 ]# _
首先,我们看一张S3的简图(Follow chart)(文章未尾,注册后可见 [register to see attachment])。2 z" {+ C4 Z1 R0 C+ G/ z. e7 v+ w
0 O6 R0 O B# @/ Z1 ]+ `" {我们再细讲S3的每个步骤:
2 `/ Q5 |, _5 Q1 T5 j/ U7 o$ d
/ B+ a9 z1 Q2 P+ GHW上电,BIOS跑第一条指令,最先会初始化一些CPU与Chipset必须的register。
4 J& `4 i* i0 _& q% N
g& Q+ A6 ?& b; P5 E5 @再判断是否是S3返回,这个如何判断,就看BIOS的做法,也就是BIOS在前一次进入时,把进S3的标识存于何处(CMOS?ACPI IO BASE?)6 ^2 i9 E9 `/ C) Y0 s! E
如果判断是S3返回,那么BIOS就去Restore在前一次save的各Device(PCI/SATA/USB/LAN/SIO/Other...)和chipset(南北桥)的register的值(见红字,绿箭头),此间是否enable acpi需看BIOS的作法.
H! ?" [5 ?, L4 g( j- ~# I) ^1 J& p' Y/ ` ?% D$ i3 b" g
如果判断不是S3返回(也许是S4 & S5),那么BIOS跑正常流程,到Boot OS前,BIOS会做SMM的初始化动作,这个动作会初始化ACPI部分的代码(AML)和Table。同时也会初始化ACPI Enable/Disable的方法。如果BIOS声明Only support ACPI。那么BIOS会 Enable acpi,同时置SCI_EN Bit为1。如果没声明,一般是Disable ACPI,同时设SCI_EN Bit为0。+ P8 e" B, ?* A/ z
6 Z8 [: j7 H. M) X0 s3 A! \# y" P
然后Boot OS,OS Boot Loader会先判断内存的使用情况(Int 15h, function 0E820h),以及读取ACPI信息为已所用,包括SMI PORT/Enable acpi command等等,然后加载OS的Image,从何处加载,这看OS Loader的做法,因为S4会把内存的Image放至何处呢?OK,先不管OS此阶段的行为。
4 e9 W4 G- p. f$ u2 B% n" W
! C/ @- k2 R4 \& `OS Load Some Images之后,或从S3 resume回来之前会check acpi 是否是enable,如果不是,那就要打开ACPI Enable,前面也提到,BIOS在Boot OS之前或S3 resume恢复寄存器时,都可以先Enable acpi,如果没有Enable,OS会依ACPI TABLE提供的信息,发送SMI去enable ACPI。Enable ACPI的动作比较繁多....具体见你所开发平台的Porting/Design Guide.* v4 T: B1 Z% M) q* [4 `- t
. t2 N" {# [. U3 ?4 L
至此,打完ACPI support之后,如果为Sx(ex:s2/s3/s4)返回,那么就会执行TTS,_WAK等方法,同时OS会Notify各driver和application,告诉它他,"Hi Guns, I already resume from Sx!, Wroking now,Good luck!",如果不小心死在这里...你可能会两眼泪汪汪,用windbg吧。如果从正常启动,那么可能会执行一些驱动初始化的方法,如_PDC(Processor Driver Capabilities)等方法...
4 B" u: f o/ `6 a. z: S* h) @0 H7 L) r
就此打住,请听下回分解。
& W: _/ W, S6 ~- B
/ |6 P9 [: r" V& `0 @S3软件这部分的流程图(图片点击可放大)/ K' _* [0 K1 D# c! p
|
|