|
一:平台初始化的多个阶段:$ v; X5 g# ]5 K+ h
(1) Pre-EFI Initialization (PEI)
5 }0 \ a l' JPEI 负责尽可能的初始化平台为执行DXE 做准备,
# ^, ~: \: U* }(2) Driver Execution Environment (DXE)
+ _, o: H* E' z! @( d在DXE 阶段可能会改变PEI 初始化的环境,有些参数会被DXE 重写。
% b' \) {' v, P
6 F; p e4 I" a2 @二:平台初始化的流程:, h' i% O$ Y# j# N8 [4 I8 R2 W0 E
(1) I/O 操作- |4 W# u% I' `: [5 R+ V
(2) 内存操作6 W( K9 n4 w$ T. v" g: l( h+ o
(3) 配置PCI 配置空间( s: |" d& Z g( \0 `/ N0 d
(4) 通过PPIs 收集平台的动作。
; E, ~% H4 U. T7 ^
* t5 R6 v: ]) @$ q, ^0 F1 F; m三:恢复平台状态:
7 q$ r0 |% W' mS3 返回是加载平台的Preboot 配置,加载的过程需要通过所有的Framework 初始化,因为
7 f. W" V7 a3 i i2 }Framework 不知道以下信息' r* D& j4 r- Y
* PEIMs 提供的Preboot 配置8 D @! u2 `7 {3 v( M' c
不同厂商提供的驱动最后Framework 还是需要像正常启动一下执行一次,执行流程2 M& B% l! P) n: @# r" @% _3 B
如下:1 P2 L. ^ O" D. J# @0 P
% x7 U- `7 r/ }8 W' n+ u: X. F
. H' J9 p% I% h7 z' f( p
6 d2 M1 ]4 [8 N& P+ t% t
四:S3 恢复阶段的执行流程:
5 `$ G; Z) e8 G& dSEC 是第一个被Framework 执行的,因此SEC 保存了S3 返回时的启动路径$ J+ v j/ Y% |5 Q: N. L& O
1:PEI 和S3 返回的路径:2 C9 x% {+ O) w* C" I! m
S3 返回时Framework 将加载PEI 的端口配置。PEIM 可能调用相应的PEI 服务找出正
9 S2 F% y% b% L7 F& t* E. v8 K确的启动路径。PEIM 会保存配置正常的启动过程,并且利用来配置S3 的返回路* V4 H% m0 w+ M9 g( Q, ]
径。2 V& z3 |" Z3 {2 R9 x z! P
9 m3 J6 A( v( @+ x2:在PEI 过程中保存配置数据9 W( s! L% W, P% U
有很多种方法来保存配置数据,如firmware volume 变量,nonvolatile storage (NVS)6 U1 }" y: T5 q: r" g, ~
3: DXE 和S3 返回启动路径% H7 z" @3 Y# z6 I: h
在DXE 阶段,有多种DXE 可以使平台到Preboot 阶段。让DXE 进入S3 返回启动路径, a. G" ^4 ]5 N/ l
使DXE 驱动存在一定风险,原因如下: * DXE 启动有很多服务,这使它变的很庞大! S9 s, n8 H8 d' A. H0 v& w
* 加载DXE 从flash 空间需要一定的时间。
如果DXE 在启动过程中能在NVS 中保存,那么DXE 需要的大量内存和复杂的
1 t1 P: F1 B% n. X% EDXE 启动过程就不需要执行。$ Q6 P5 V% S3 r3 E8 b/ V" X
Framework 提供一个boot script 让S3 返回时获得DXE 的所有信息。这些信息是在
) X, L T4 r: y% c- E7 `" n* v; {DXE 驱动正常启动过程中保存在平台的NVS 中形成的。在S3 启动过程中到NVS 中查" r& e4 q) O7 m5 D9 U3 ~
找boot script,! g9 `1 e$ }, j- c" H* o9 K
找到后加载这些配置。 * ACPI 要求BIOS 加载chipset 和CPU 的配置信息
. s# `3 O a8 i9 R+ a/ K8 B& y* Chipset 的配置包括:memory,I/O 和PCI 的配置。这些信息是在DXE 启动过程( u+ x! G: F. N, i7 a7 |, x$ `
中保存下来的。$ S" z+ M. ^1 Q# ]
* CPU 的配置包括:SMM,Microcode updates, Processor-specific initialization,
& I& R) j, X5 i# @8 F- lProcessor chache setting.
4: Framework Boot Script:
2 x) V5 C0 _4 Y9 X* b' r: ^3 ?Framework boot script 是一个script 用来描述一些常用的初始化平台操作。如I/O,2 J2 l/ w0 E. [( p' Z# @
memory, PCI 和SMBus。8 ]3 H! F* E8 y- ~
可能有多个boot script tables 在某些平台,这些table 描述了如何成功让平台进入
6 Y0 u1 }; w0 h+ TPreboot 状态。2 }& \( F4 N, m; V
5:S3 返回PPI 和DXE IPL PPI5 A( K2 X% V# o* P! P ~. g- p: v( @
DXE IPL PPI 是最后一个被执行的PPI 在PEI 阶段,将提供正确的启动路径给
/ {! ?6 v, [! N' F% L v# KFramework。因此,DXE IPL PPI 将初始化CPU 和Preboot 平台,最后跳到OS 的
( \+ f% v/ U( G |# |& \呼醒向量处。在正常启动时DXE 是不会执行他的。# w+ v6 j' c- k0 P( E r
在S3 返回时,DXE IPL PPI 将会定位S3 Resume PPI.如果被找到,DXE IPL PPI 将会把
4 x: ^% M7 m& ~0 k8 q9 n; V控制权交给S3 Resume PPI. S3 Resume PPI 将会执行一此配置让平台进入Preboot: m. m$ l& S9 B
state./ _2 t/ N0 V; Q" F2 N
S3 Resume PPI 必须执行Framework boot Script table 来加载平台配置。它负责找到OS9 r4 ` P& q& \! M
waking vector 并且将控制权交给OS 来完成S3 返回。
' C, M2 B+ ]2 s2 K1 z& O1 q在整个过程中,只有内存是S3 启动可以使用的。任何内存使用会扰乱系统的context(国
3 R# j" }$ Z' D' F" ?入喜欢叫他为 上下文 ),使S3 失败。* T3 m& E0 N! P& n2 b4 j/ i: @
S3 Resume PPI 需要知道如下情况:8 S5 |- @$ B/ o
* 内存S3 boot Script Table 的地址或者firmware volume file 中S3 boot script table& [+ I! `+ k, x: e
的地址。( m# G% ^. u8 e* L) C r
* RSDT 指针中ACPI 开始的地址和OS 的waking vector
+ b& n0 M2 d q: F' a# h* 保留一段内存给S3 返回时使用。 ) d3 E! K& I% t
|
|