|
|
一:平台初始化的多个阶段:
! z$ X8 L# ^4 I! k(1) Pre-EFI Initialization (PEI) [+ s! F* Q# t2 x
PEI 负责尽可能的初始化平台为执行DXE 做准备, _' x; j, G+ V8 a6 |# y, o
(2) Driver Execution Environment (DXE)7 F% J( R3 W/ c
在DXE 阶段可能会改变PEI 初始化的环境,有些参数会被DXE 重写。
0 g; c7 y7 d2 I" w2 L( O/ t. r9 ^( d% X0 B( \- I
二:平台初始化的流程:& l- W$ W, k6 p" e) M
(1) I/O 操作9 U$ Q. Q9 X3 }; K7 ]: w
(2) 内存操作4 e# J$ s/ M0 D7 _' d% Q' X" G# j
(3) 配置PCI 配置空间" a/ D1 Q. \5 ^
(4) 通过PPIs 收集平台的动作。
6 d/ n: D. O& t, ]. @$ N2 g, U. }8 e
三:恢复平台状态:! ^) o& U1 S. B
S3 返回是加载平台的Preboot 配置,加载的过程需要通过所有的Framework 初始化,因为$ G; }0 H9 z" [* t) L! o' c
Framework 不知道以下信息6 u! j, S. j. [
* PEIMs 提供的Preboot 配置) O I+ J+ r2 a
不同厂商提供的驱动最后Framework 还是需要像正常启动一下执行一次,执行流程
" L% e9 l' H& r/ X a2 B6 S8 z如下:
$ ]/ U* R0 @8 O* o1 \+ N
3 G, h" K4 @5 ^! h
1 @" G3 @% Y5 n4 u4 R9 _4 C
{# U: O& L% _ O四:S3 恢复阶段的执行流程:
5 ^ g4 ^9 l; \+ h6 WSEC 是第一个被Framework 执行的,因此SEC 保存了S3 返回时的启动路径
4 |8 ^% w6 N# Z3 K1:PEI 和S3 返回的路径:' ?/ }% `, m8 U7 U, j; K: T
S3 返回时Framework 将加载PEI 的端口配置。PEIM 可能调用相应的PEI 服务找出正
& V5 m& q' X0 |9 e- T确的启动路径。PEIM 会保存配置正常的启动过程,并且利用来配置S3 的返回路
+ f. O0 n& B. G7 Y' R- F6 ^9 d径。
$ s3 L3 `. h0 g# a, v r9 ]
" @5 Y$ d4 X. J/ s+ {3 V0 R g5 n, H2:在PEI 过程中保存配置数据
/ q& s! I# {6 n7 e; E/ z6 `有很多种方法来保存配置数据,如firmware volume 变量,nonvolatile storage (NVS)
' r" U3 { L# B: C1 Q3: DXE 和S3 返回启动路径$ M2 r6 u0 `7 x' a# o0 G3 X
在DXE 阶段,有多种DXE 可以使平台到Preboot 阶段。让DXE 进入S3 返回启动路径, v6 z/ @( B" R$ Q8 G0 N
使DXE 驱动存在一定风险,原因如下: * DXE 启动有很多服务,这使它变的很庞大
# z" t( m; E7 T8 z" f* U* 加载DXE 从flash 空间需要一定的时间。
如果DXE 在启动过程中能在NVS 中保存,那么DXE 需要的大量内存和复杂的
. t0 M9 T3 B0 C5 |DXE 启动过程就不需要执行。
$ K. F; d9 { iFramework 提供一个boot script 让S3 返回时获得DXE 的所有信息。这些信息是在
: @3 x# q% A4 I0 f4 O% i0 k6 WDXE 驱动正常启动过程中保存在平台的NVS 中形成的。在S3 启动过程中到NVS 中查
) a1 @1 n+ y8 H找boot script,3 ~+ q6 K, c# o! D K
找到后加载这些配置。 * ACPI 要求BIOS 加载chipset 和CPU 的配置信息 R( C$ W C, x m/ R
* Chipset 的配置包括:memory,I/O 和PCI 的配置。这些信息是在DXE 启动过程
( B( @/ V# o% K2 B- u1 J; T) I中保存下来的。6 U! q2 O9 L/ h% [. _" m
* CPU 的配置包括:SMM,Microcode updates, Processor-specific initialization,8 V8 y7 ?* z9 Z0 }6 Z/ t7 u9 \
Processor chache setting.
4: Framework Boot Script:2 R0 |% T6 G+ S
Framework boot script 是一个script 用来描述一些常用的初始化平台操作。如I/O,( x3 h4 U- G+ k" _3 h& s
memory, PCI 和SMBus。* H3 M* H( C9 f7 v( A
可能有多个boot script tables 在某些平台,这些table 描述了如何成功让平台进入
/ A: C4 q4 Z$ n& J: hPreboot 状态。1 ~5 u2 _ |) v1 ^ z
5:S3 返回PPI 和DXE IPL PPI
* C! \* f+ N& u0 U5 I/ C" b& iDXE IPL PPI 是最后一个被执行的PPI 在PEI 阶段,将提供正确的启动路径给
. G$ G- ~! b! R+ aFramework。因此,DXE IPL PPI 将初始化CPU 和Preboot 平台,最后跳到OS 的
0 w S# M+ y) w呼醒向量处。在正常启动时DXE 是不会执行他的。
5 b0 Z* i3 q1 y6 G, z. P* E( ~在S3 返回时,DXE IPL PPI 将会定位S3 Resume PPI.如果被找到,DXE IPL PPI 将会把+ P7 o0 ?8 c, L# Q
控制权交给S3 Resume PPI. S3 Resume PPI 将会执行一此配置让平台进入Preboot; c I* b: ] b& ^
state., r% `$ t4 ]# K+ K
S3 Resume PPI 必须执行Framework boot Script table 来加载平台配置。它负责找到OS9 I4 H! ?1 m& E6 s- L" Z
waking vector 并且将控制权交给OS 来完成S3 返回。7 D5 q* i- F* y2 z6 ^ C% S
在整个过程中,只有内存是S3 启动可以使用的。任何内存使用会扰乱系统的context(国1 w6 h6 i5 i9 g+ H9 y: D* C% u
入喜欢叫他为 上下文 ),使S3 失败。
P8 y; _( s3 XS3 Resume PPI 需要知道如下情况:5 T& @& N' `$ k" Q/ k3 X5 t
* 内存S3 boot Script Table 的地址或者firmware volume file 中S3 boot script table% K W; o# w, c% x% z; o( z
的地址。! ]0 I- I+ g- R# i' D% a
* RSDT 指针中ACPI 开始的地址和OS 的waking vector. w. i( j* _" H: _: Y) I. @
* 保留一段内存给S3 返回时使用。 3 \0 Z3 }, R3 u a4 M
|
|