bini 发表于 2008-1-29 17:10:32

[原创]BIOS知识点滴Follow Bini系列之--ACPI S3步骤

--易祝兵
你应该知道ACPI是什么东西了吧? 本小文章讲述一下软件在ACPI S3时的动作,在你看此文章之前,如果不知道这些名词。那就请close或跳到其它地方浏览



前提:ACPI BIOS ACPI OS,Support S3.

首先,我们看一张S3的简图(Follow chart)(文章未尾,注册后可见 )。

我们再细讲S3的每个步骤:

HW上电,BIOS跑第一条指令,最先会初始化一些CPU与Chipset必须的register。

再判断是否是S3返回,这个如何判断,就看BIOS的做法,也就是BIOS在前一次进入时,把进S3的标识存于何处(CMOS?ACPI IO BASE?)
如果判断是S3返回,那么BIOS就去Restore在前一次save的各Device(PCI/SATA/USB/LAN/SIO/Other...)和chipset(南北桥)的register的值(见红字,绿箭头),此间是否enable acpi需看BIOS的作法.

如果判断不是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。

然后Boot OS,OS Boot Loader会先判断内存的使用情况(Int 15h, function 0E820h),以及读取ACPI信息为已所用,包括SMI PORT/Enable acpi command等等,然后加载OS的Image,从何处加载,这看OS Loader的做法,因为S4会把内存的Image放至何处呢?OK,先不管OS此阶段的行为。

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.

至此,打完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)等方法...

就此打住,请听下回分解。

S3软件这部分的流程图(图片点击可放大)

winbondowen 发表于 2008-1-29 22:32:29

BIOS在postBiosReset时会做ACPIreset来确定是从SX状态返回。
那是不是机台从SX状态返回时都会从BIOS的第一条指令来执行呢?

老大好久没有发新作了。。。。
加油啊。。。。
嘿。。。。。

bini 发表于 2008-1-30 09:36:10

那我再给你翻ACPI SPEC吧,这问题可以在ACPI SPEC里找到答案。
ACPI 3.0b page 86有如下描述:

While in any of the sleeping states (G1), an enabled “Wake” event will cause the hardware to sequence the system back to the working state (G0). The “Wake Status” bit (WAK_STS) is provided for OSPM to “spin-on” after setting the SLP_EN/SLP_TYP bit fields. When waking from the S1 sleeping state, execution control is passed backed to OSPM immediately, whereas when waking from the S2-S5 states execution control is passed to the BIOS software (execution begins at the CPU’s reset vector). The WAK_STS bit provides a mechanism to separate OSPM’s sleeping and waking code during an S1 sequence. When the hardware has sequenced the system into the sleeping state (defined here as the processor is no longer able to execute instructions), any enabled wake event is allowed to set the WAK_STS bit and sequence the system back on (to the G0 state). If the system does not support the S1 sleeping state, the WAK_STS bit can always return zero.

winbondowen 发表于 2008-1-31 21:31:23

ACPI 3.0b page 422 “Waking and Sleeping“說明。
今天才看到。
:victory:
晚饭还没有吃呢
快晕了!

david 发表于 2008-2-4 11:37:26

够哥们,把自己的心得都整理出来了。

ellaliu812 发表于 2008-3-14 13:58:29

我碰到一个问题,向您请教:

    我在让机器进入S3状态后,采用POWER BUTTON wakeup 的时候出问题了,我不确定BIOS停在哪个位置,但我可以肯定它没有进入 S3 resume,也没有去找waking_up_vector.
    我估计是在BIOS 在刚上电就死掉了,如果是这样的话,应该是在初始化的时候出了问题,spec上有讲6个步骤的初始化:CUP Initial, init memory controller,enable memory,config caches,enable caches,init chipset. 大侠对这几个初始化过程熟悉吗?可否发贴让大家学习一下。

我现在对这个问题毫无头绪,请大侠指定一下 ,非常感谢!

bini 发表于 2008-3-14 15:03:24

加debug 码、量信号,先确定死在哪里.

ellaliu812 发表于 2008-3-17 14:27:17

这个问题已经解决了 谢谢 ~~

我还有一个疑问:wakingup_vector 应该是一个物理地址,但是我们怎么能够将我们自己写的 wake_up function 放到这个地址上去呢?

我们所能操作的都应该是虚拟地址吧?如果是这样,那就只能将wake_up function 放到这个物理地址对应的虚拟地址上去了。

BIOS在wakeup 的时候,不可能跳到一个虚地址去执行吧?

这个问题百思不得其解,还望大侠指教:handshake

zclsucc 发表于 2008-5-12 08:54:38

如果解决了!请将问题点及方法告知一下!

xtdumpling 发表于 2008-5-12 09:55:29

试着回答8楼:
这个地址应该是物理地址,这个地址是由OS在进入S3的时候来填的。

OS在进入S3时,会将S3回来时要执行的Resume 的入口地址,填到Wake_UP_Vector,
在BIOS完成s3 Resume 后【big real mode】,会跳到wake_up_vector,OS的resume开始执行。

个人理解。

xtdumpling 发表于 2008-5-12 13:08:54

具体的,可以看看这个帖子 '【Help】acpi Waking Vector什么时候赋值啊?'
http://www.biosren.com/thread-96-1-2.html

kelvinklee 发表于 2008-6-9 13:24:49

回复 8# 的帖子

Wake_UP_VECTOR是OS填写在FACP(或者是FACS,记不清了) Table中的,是一个物理地址。在Far Jmp Wake_up_Vector之前CPU要转换为Real Mode. ACPI Spec中有对Wake_Up_Vector的描述。

colin_wang 发表于 2009-8-7 16:55:44

狼哥,你到是接著分解啊!等著你呢!

sanshuisho 发表于 2009-12-4 17:35:37

谢谢,学习中

litomboy 发表于 2011-6-3 10:19:51

狼哥,你到是接著分解啊!等著你呢!

Erica圆 发表于 2012-7-16 14:07:23

由S0状态进入S3之前,会储存一些信息到Memory中,储存的具体信息有哪些,都是通过什么指令和函数实现的呀?
俺是新手,求老大耐心指导一下。
不胜感激!
:loveliness: 嘿嘿嘿……

vigor123 发表于 2014-4-5 08:13:59

很好的帖子, 学习了

a005182 发表于 2014-8-27 08:07:04

感謝分享正需要去了解
页: [1]
查看完整版本: [原创]BIOS知识点滴Follow Bini系列之--ACPI S3步骤