|
|
一:平台初始化的多个阶段:
$ C0 v* K( `# Y2 V4 h$ G# S* i0 _(1) Pre-EFI Initialization (PEI), h) a: O' g+ ^5 M' N9 A
PEI 负责尽可能的初始化平台为执行DXE 做准备,
3 A% E- o& ^, O4 Y5 S2 x! h(2) Driver Execution Environment (DXE)) x) x6 o6 Z( V( H. `4 Z
在DXE 阶段可能会改变PEI 初始化的环境,有些参数会被DXE 重写。 7 X) M' B3 ]' _- |( L: U
; h ?% R( f% W. F% I$ @7 l9 @% {二:平台初始化的流程:1 S* v8 i0 t7 I
(1) I/O 操作
% P6 w$ t! c; v, s+ i' ^$ N- f: O$ r(2) 内存操作
# ]# Z( f$ r+ Y+ d/ @( w(3) 配置PCI 配置空间
& x S6 N( D3 S) T6 J) K2 U(4) 通过PPIs 收集平台的动作。
2 _, }& U# R) e8 d7 ^4 _- E" g! V+ m/ T+ X$ `
三:恢复平台状态:
3 e8 L+ C. J. h" }: }S3 返回是加载平台的Preboot 配置,加载的过程需要通过所有的Framework 初始化,因为
( N. F, \* v1 X/ ]) y3 h, ^Framework 不知道以下信息1 s: F, q& Q2 q: q
* PEIMs 提供的Preboot 配置
2 D2 d0 t. s+ V2 \ 不同厂商提供的驱动最后Framework 还是需要像正常启动一下执行一次,执行流程
1 b9 S* {% V* ~+ {5 \$ e4 m2 N如下:1 s7 Y$ W6 D2 S2 F: e t$ a6 Y
$ Y; {, O$ r7 ?
" i8 P5 O6 v% p, ]6 a& x
: e7 @% Q) ^; o四:S3 恢复阶段的执行流程:1 [' B/ L! _2 A7 u! K! r e& o
SEC 是第一个被Framework 执行的,因此SEC 保存了S3 返回时的启动路径
+ T% X3 w7 c- {7 I% T7 v1:PEI 和S3 返回的路径:0 ^+ E$ \8 C, D( B- @4 S( X2 D! \# t
S3 返回时Framework 将加载PEI 的端口配置。PEIM 可能调用相应的PEI 服务找出正6 v* Z; V0 d1 K7 `5 b( t6 N
确的启动路径。PEIM 会保存配置正常的启动过程,并且利用来配置S3 的返回路
0 W! a. G6 J* i4 |: ?径。
- v ^! K4 z g, @9 f( t, m% U
. `) R' `2 h! I: _6 [1 r2:在PEI 过程中保存配置数据
% R- k7 ?9 }" E$ p$ v- U/ x' S# W有很多种方法来保存配置数据,如firmware volume 变量,nonvolatile storage (NVS)0 ?% _% }& z( T1 J! S1 z
3: DXE 和S3 返回启动路径
4 ~) L/ Q. W7 t8 c2 Q ?& z4 ?在DXE 阶段,有多种DXE 可以使平台到Preboot 阶段。让DXE 进入S3 返回启动路径- C9 m( l% D, i( q3 c/ g2 ?2 b
使DXE 驱动存在一定风险,原因如下: * DXE 启动有很多服务,这使它变的很庞大/ Y2 {$ ~3 \ P4 b. n5 t5 X0 v
* 加载DXE 从flash 空间需要一定的时间。
如果DXE 在启动过程中能在NVS 中保存,那么DXE 需要的大量内存和复杂的, u9 N, ^9 z1 B7 Q b: c7 I# [( s
DXE 启动过程就不需要执行。8 L+ C6 ~0 y7 N: ~4 A2 O4 ]
Framework 提供一个boot script 让S3 返回时获得DXE 的所有信息。这些信息是在# d, E+ M' r9 l! a+ L M* w F+ M
DXE 驱动正常启动过程中保存在平台的NVS 中形成的。在S3 启动过程中到NVS 中查' e" L V& F' g4 b7 [/ v% _" A2 v
找boot script,; {& W- V% u: b& w# C+ z7 Z$ f
找到后加载这些配置。 * ACPI 要求BIOS 加载chipset 和CPU 的配置信息' J* ^% F5 v1 q/ R6 K- X
* Chipset 的配置包括:memory,I/O 和PCI 的配置。这些信息是在DXE 启动过程
( O% s8 _9 j0 Q/ i+ c5 L, r中保存下来的。! E, }( I! v+ k y
* CPU 的配置包括:SMM,Microcode updates, Processor-specific initialization,
- F* C! @7 ]) PProcessor chache setting.
4: Framework Boot Script:
6 k, F& G. x3 ^9 p* X/ R. a; X: f/ lFramework boot script 是一个script 用来描述一些常用的初始化平台操作。如I/O,
% H I( P* U* [9 H: ]0 m+ d" Amemory, PCI 和SMBus。6 l0 `" t* W% q% l7 V4 O
可能有多个boot script tables 在某些平台,这些table 描述了如何成功让平台进入# E3 e5 [6 s B4 R( w/ R0 b
Preboot 状态。
4 u0 l {- P) _% M; l* _5:S3 返回PPI 和DXE IPL PPI% T% y4 f+ O' v2 k" Z
DXE IPL PPI 是最后一个被执行的PPI 在PEI 阶段,将提供正确的启动路径给5 Q0 e( i; l0 F' l ~
Framework。因此,DXE IPL PPI 将初始化CPU 和Preboot 平台,最后跳到OS 的. N) g: g3 {' @* [, ?! V: D
呼醒向量处。在正常启动时DXE 是不会执行他的。# s/ B B( ~) J3 r; ^
在S3 返回时,DXE IPL PPI 将会定位S3 Resume PPI.如果被找到,DXE IPL PPI 将会把
1 l% ~' j; n5 z- W, Q控制权交给S3 Resume PPI. S3 Resume PPI 将会执行一此配置让平台进入Preboot
5 d4 B$ [' Q1 ]8 Z5 Y* astate.
# E% J9 W. f4 y0 v# g' W, v( r5 OS3 Resume PPI 必须执行Framework boot Script table 来加载平台配置。它负责找到OS
+ d, X7 Z6 G$ R& j; Cwaking vector 并且将控制权交给OS 来完成S3 返回。
- L. n; w. y/ i/ A在整个过程中,只有内存是S3 启动可以使用的。任何内存使用会扰乱系统的context(国
5 Y( S* e5 _7 w6 Q- m- w入喜欢叫他为 上下文 ),使S3 失败。
' z- o3 y% p* B3 ES3 Resume PPI 需要知道如下情况:
) c9 P$ R/ I" a2 d* k* 内存S3 boot Script Table 的地址或者firmware volume file 中S3 boot script table
7 I3 B8 X1 W' {+ u( L( N: X的地址。! D* k# u6 f1 e/ @4 o: v
* RSDT 指针中ACPI 开始的地址和OS 的waking vector. m& n4 R9 c3 P4 A3 p8 T7 X
* 保留一段内存给S3 返回时使用。 ' G* T2 |' R( q/ [$ n' i* i) D
|
|