|
--易祝兵
$ f/ v" h+ V0 p* {4 u你应该知道ACPI是什么东西了吧? 本小文章讲述一下软件在ACPI S3时的动作,在你看此文章之前,如果不知道这些名词。那就请close或跳到其它地方浏览
! C {; S. c0 B! c% z6 d# S3 p+ d+ _9 O2 D2 p6 P
。
* T7 g9 q3 h- y) F7 D# Z N: J; C% C6 {) h
前提:ACPI BIOS ACPI OS,Support S3.1 f8 U. S2 j0 q0 \( v0 A& X1 r
) O4 o) S! s3 k4 a! w4 w$ Y首先,我们看一张S3的简图(Follow chart)(文章未尾,注册后可见 [register to see attachment])。: g; {* |: S9 ?
, H R& A) j6 t9 g
我们再细讲S3的每个步骤:: r% Z$ L4 k, g& h( ~7 x
3 _2 \/ ]1 y& s$ ?6 _
HW上电,BIOS跑第一条指令,最先会初始化一些CPU与Chipset必须的register。$ a$ k* S. _1 Y/ t0 N
: D! y) t4 Y3 O: J. n" G再判断是否是S3返回,这个如何判断,就看BIOS的做法,也就是BIOS在前一次进入时,把进S3的标识存于何处(CMOS?ACPI IO BASE?)! t9 ~, J9 J1 t. J: Z, I
如果判断是S3返回,那么BIOS就去Restore在前一次save的各Device(PCI/SATA/USB/LAN/SIO/Other...)和chipset(南北桥)的register的值(见红字,绿箭头),此间是否enable acpi需看BIOS的作法.
9 Z& W6 \# d0 W
/ }9 i+ _1 A7 I. `6 L- {1 {+ S( [如果判断不是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。
! H# ^( w. `; O3 E/ v7 X$ p! `; c% h% a0 X/ v
然后Boot OS,OS Boot Loader会先判断内存的使用情况(Int 15h, function 0E820h),以及读取ACPI信息为已所用,包括SMI PORT/Enable acpi command等等,然后加载OS的Image,从何处加载,这看OS Loader的做法,因为S4会把内存的Image放至何处呢?OK,先不管OS此阶段的行为。! e: j4 Y# n3 ?! q$ B* i+ i
7 Y! x' i! M; S- t- q7 J+ m
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.3 o- S# q: P( T5 e" P" f% ^$ r
$ }( V) S4 A7 E9 n% t
至此,打完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 j( D: r8 M; t6 {
: u3 I/ b, I1 G6 o5 r就此打住,请听下回分解。
- }6 ~" W; l" v' v9 @1 X. X8 K) K0 s4 [' |/ T3 P) W
S3软件这部分的流程图(图片点击可放大)9 }, z) N5 {2 h! g/ k" U
|
|