|
|
一:平台初始化的多个阶段:
3 n- j! w# f9 g# n(1) Pre-EFI Initialization (PEI)( ]; U4 s8 g- j4 F. k3 K' k7 N
PEI 负责尽可能的初始化平台为执行DXE 做准备,
1 e4 j" H+ U0 p, _2 f(2) Driver Execution Environment (DXE)7 |- n# u. m+ e9 P
在DXE 阶段可能会改变PEI 初始化的环境,有些参数会被DXE 重写。 , t5 b1 ^; C% @8 t2 g N
4 A3 p- }" O3 |二:平台初始化的流程:! m" X2 i' k/ q5 P
(1) I/O 操作0 r' H$ T# u! L" g2 t
(2) 内存操作
) @3 c+ L- K3 P+ V2 [ W! F(3) 配置PCI 配置空间
2 q9 b0 S6 z9 P8 H# W, ?) @(4) 通过PPIs 收集平台的动作。 6 k! T/ P- R _/ d$ ~- p
; J4 P, y2 A" N% Z三:恢复平台状态:
9 K# L+ ?- _$ @/ X) O! C# jS3 返回是加载平台的Preboot 配置,加载的过程需要通过所有的Framework 初始化,因为
: J' B8 Y- J. U8 KFramework 不知道以下信息
( }; Q2 w q8 c6 W! x! d- ~* PEIMs 提供的Preboot 配置
( O; Y% R+ T# H) T: R* b' |3 H 不同厂商提供的驱动最后Framework 还是需要像正常启动一下执行一次,执行流程
4 s W, h I- i9 B* b. y+ b如下:* t- {' v4 k" M; ^! C8 I' K: d
. _' Z4 |4 @5 l8 f# Y6 ]( _8 K; e. N/ _- L+ A1 F
, L2 V: e- \2 a' _四:S3 恢复阶段的执行流程:/ m7 I1 H5 S: j% g2 Y) T |* f# x
SEC 是第一个被Framework 执行的,因此SEC 保存了S3 返回时的启动路径. W" E. T' n8 ]8 ^9 u+ a; V2 T: M! I/ _% F
1:PEI 和S3 返回的路径:
, v) P- K( S2 A' RS3 返回时Framework 将加载PEI 的端口配置。PEIM 可能调用相应的PEI 服务找出正- x, l5 X. S1 {+ T' F9 X1 s
确的启动路径。PEIM 会保存配置正常的启动过程,并且利用来配置S3 的返回路$ L$ g" M! }& B$ k
径。3 x. z( L+ S) ]! K+ |/ f; k
# r* j4 e2 N j1 {+ F# C2:在PEI 过程中保存配置数据4 K5 l; g3 |! x1 w# R3 U
有很多种方法来保存配置数据,如firmware volume 变量,nonvolatile storage (NVS)& c# G8 N z: d1 X! Y5 X
3: DXE 和S3 返回启动路径
8 `! S) A$ K2 R1 d在DXE 阶段,有多种DXE 可以使平台到Preboot 阶段。让DXE 进入S3 返回启动路径
+ d T+ e4 ~, F3 q+ }" p4 k使DXE 驱动存在一定风险,原因如下: * DXE 启动有很多服务,这使它变的很庞大1 F4 y0 o' l( l F+ q# _! Z
* 加载DXE 从flash 空间需要一定的时间。
如果DXE 在启动过程中能在NVS 中保存,那么DXE 需要的大量内存和复杂的6 P- e' x. m& |6 }
DXE 启动过程就不需要执行。# N+ w+ f8 y6 R1 [' ?% `% A+ J( M- r
Framework 提供一个boot script 让S3 返回时获得DXE 的所有信息。这些信息是在; n/ n$ t0 o$ @9 j2 x
DXE 驱动正常启动过程中保存在平台的NVS 中形成的。在S3 启动过程中到NVS 中查
* G" m. _2 ?, j2 ?找boot script,
3 L; p" F! d/ s+ D1 t4 D找到后加载这些配置。 * ACPI 要求BIOS 加载chipset 和CPU 的配置信息1 B: G4 L# T0 l! x$ y- w- d
* Chipset 的配置包括:memory,I/O 和PCI 的配置。这些信息是在DXE 启动过程4 ]% X8 G& [. W h7 u4 T6 c
中保存下来的。, `, [3 _1 g) E
* CPU 的配置包括:SMM,Microcode updates, Processor-specific initialization,9 @8 |! X2 e! V% z# j/ m$ G+ A5 ?# n
Processor chache setting.
4: Framework Boot Script:5 }$ G' I8 d" @* l0 I
Framework boot script 是一个script 用来描述一些常用的初始化平台操作。如I/O,
- }: w; n$ v2 J1 y/ j* B. ^# n/ Pmemory, PCI 和SMBus。% L6 H& D/ {: p/ j; Q, m
可能有多个boot script tables 在某些平台,这些table 描述了如何成功让平台进入
& U2 s7 a2 |4 G7 h7 c; G U2 [; sPreboot 状态。+ P( z% y- D0 l- |2 A; V5 ~
5:S3 返回PPI 和DXE IPL PPI5 A2 Y& I. {5 f+ B
DXE IPL PPI 是最后一个被执行的PPI 在PEI 阶段,将提供正确的启动路径给
+ a: U, K' H7 OFramework。因此,DXE IPL PPI 将初始化CPU 和Preboot 平台,最后跳到OS 的" s% o" c( X- ?( ]
呼醒向量处。在正常启动时DXE 是不会执行他的。
8 E1 r" P' x" k/ N在S3 返回时,DXE IPL PPI 将会定位S3 Resume PPI.如果被找到,DXE IPL PPI 将会把
+ S/ W- m7 |" a" U1 v- u1 H2 S, Y3 q控制权交给S3 Resume PPI. S3 Resume PPI 将会执行一此配置让平台进入Preboot; e5 U! J" }! e0 A: b
state.
8 Z' Y7 R/ N6 \3 kS3 Resume PPI 必须执行Framework boot Script table 来加载平台配置。它负责找到OS, z2 X# N) \1 b( }, O
waking vector 并且将控制权交给OS 来完成S3 返回。
9 F. W+ u5 t% c! k$ f8 w3 |在整个过程中,只有内存是S3 启动可以使用的。任何内存使用会扰乱系统的context(国
. V: k R D: R# M- f入喜欢叫他为 上下文 ),使S3 失败。- i/ u; G; ?% ]: n
S3 Resume PPI 需要知道如下情况:: `& \6 N8 E% U& @
* 内存S3 boot Script Table 的地址或者firmware volume file 中S3 boot script table3 D/ [: p- d) f* Q* d5 m' w
的地址。" A ~) m \8 W% E ~& t
* RSDT 指针中ACPI 开始的地址和OS 的waking vector% d& G$ H5 W$ x- q7 b6 v7 O. o
* 保留一段内存给S3 返回时使用。 ) y9 l" Z2 @+ v1 a
|
|