|
--易祝兵 . {" D& J f' {% n; X" t& [
你应该知道ACPI是什么东西了吧? 本小文章讲述一下软件在ACPI S3时的动作,在你看此文章之前,如果不知道这些名词。那就请close或跳到其它地方浏览
+ z. V& u7 s# @5 \$ ~5 Q) z" u8 {3 p. I) l
。
' L) T9 B- o7 k9 f7 @3 X& a& o+ g+ w7 O$ z: @5 t3 {# G
前提:ACPI BIOS ACPI OS,Support S3.
$ y" `1 y5 M+ ^4 k Y. @; |, Z L$ X
首先,我们看一张S3的简图(Follow chart)(文章未尾,注册后可见 [register to see attachment])。. J7 ^" _( w& Q) c. U3 N }
: n C: e2 Q& i7 _& M我们再细讲S3的每个步骤:
/ C- l/ b, t% [( S% U9 k4 g/ @ y: U
/ F$ E5 f! I8 k" h1 QHW上电,BIOS跑第一条指令,最先会初始化一些CPU与Chipset必须的register。0 |8 ~! x& ]0 m% R4 V, p
X7 r: s+ z& K' E/ W2 d
再判断是否是S3返回,这个如何判断,就看BIOS的做法,也就是BIOS在前一次进入时,把进S3的标识存于何处(CMOS?ACPI IO BASE?); D8 \9 x+ I3 E6 \
如果判断是S3返回,那么BIOS就去Restore在前一次save的各Device(PCI/SATA/USB/LAN/SIO/Other...)和chipset(南北桥)的register的值(见红字,绿箭头),此间是否enable acpi需看BIOS的作法.& }% Y7 i$ D0 [% ~2 J& o
$ `8 F& Y, d1 p+ M: K' w如果判断不是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。5 ?* H8 N3 `5 d
- T6 ~6 ^2 N( l然后Boot OS,OS Boot Loader会先判断内存的使用情况(Int 15h, function 0E820h),以及读取ACPI信息为已所用,包括SMI PORT/Enable acpi command等等,然后加载OS的Image,从何处加载,这看OS Loader的做法,因为S4会把内存的Image放至何处呢?OK,先不管OS此阶段的行为。
4 \4 _) X% M& P: ?
) r$ X0 U4 }. Z& 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.; m# ^; c ~2 d. ~. m5 V% n
! E4 t, M8 ?; B' a1 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)等方法...7 I/ W: Z2 I7 F* T' f1 Q$ e
. ?# l- d! t) S8 h* e/ y就此打住,请听下回分解。& I" e2 m0 q4 `- C5 [* p$ a: \2 J
" |! g: w8 R3 r3 c# X
S3软件这部分的流程图(图片点击可放大)
( t6 g1 u! l: @0 `2 N4 Y. ~# J
|
|