|
|
一:平台初始化的多个阶段:' U" s* [& k" _6 C+ c2 e& c
(1) Pre-EFI Initialization (PEI)
' C0 R3 {# I' s0 j$ b3 n8 R; tPEI 负责尽可能的初始化平台为执行DXE 做准备,
, y0 f v, B5 J0 W" }8 i(2) Driver Execution Environment (DXE)# }" T1 t: a% d- Z
在DXE 阶段可能会改变PEI 初始化的环境,有些参数会被DXE 重写。
9 h8 Z- h. e9 L9 d6 Q
' d j& c6 R# \# x/ s$ M1 q二:平台初始化的流程: Z* J7 y1 y4 R
(1) I/O 操作1 l% M+ l4 j, Y$ k$ [% s0 s
(2) 内存操作9 |. S. g- S! u# @6 q& K
(3) 配置PCI 配置空间
- E, [4 g5 e3 b( K% {3 M% S(4) 通过PPIs 收集平台的动作。
* z) h5 P% O% ]+ m/ h2 M+ |
. n3 z; c9 p) S& M. y/ a9 p三:恢复平台状态:
: A( w, N5 l9 r6 y+ HS3 返回是加载平台的Preboot 配置,加载的过程需要通过所有的Framework 初始化,因为
' e' `) [: v% R# LFramework 不知道以下信息, J |+ ~* e) f* x3 Q& V
* PEIMs 提供的Preboot 配置0 ?% Z0 @: L6 p2 Q
不同厂商提供的驱动最后Framework 还是需要像正常启动一下执行一次,执行流程
1 q8 M" ]* w$ v如下:/ i5 ~5 P2 i0 N6 b" ?$ i: ?
* L3 P4 v/ a5 H& }
9 N* p+ O8 i( y, z, C( u* |# m- c9 Y" J+ m
四:S3 恢复阶段的执行流程:) q. X- f, t8 t4 @" d+ ^
SEC 是第一个被Framework 执行的,因此SEC 保存了S3 返回时的启动路径! @) N9 U" C; c+ ?0 ~' }
1:PEI 和S3 返回的路径:
" u+ Z/ F9 d* y6 t1 V) sS3 返回时Framework 将加载PEI 的端口配置。PEIM 可能调用相应的PEI 服务找出正2 a/ w, B+ a/ v" w j
确的启动路径。PEIM 会保存配置正常的启动过程,并且利用来配置S3 的返回路: f R% l u. g4 C; S
径。4 S+ C* }7 |5 I) y
- [, \8 A v! e
2:在PEI 过程中保存配置数据
. d/ q w/ R; X8 B' L4 ?. J Z有很多种方法来保存配置数据,如firmware volume 变量,nonvolatile storage (NVS)0 X; `( L: r. x# G) k! P8 _% G* H
3: DXE 和S3 返回启动路径/ {, O" `5 r* S8 k8 |7 D6 S
在DXE 阶段,有多种DXE 可以使平台到Preboot 阶段。让DXE 进入S3 返回启动路径1 W4 y3 ^$ C+ ]7 W' W
使DXE 驱动存在一定风险,原因如下: * DXE 启动有很多服务,这使它变的很庞大
' Q$ B0 K2 G' F M1 G( R K* 加载DXE 从flash 空间需要一定的时间。
如果DXE 在启动过程中能在NVS 中保存,那么DXE 需要的大量内存和复杂的
% I9 `3 K C; Y3 i( U4 T9 B4 fDXE 启动过程就不需要执行。
# f* T5 Y# c' h7 c+ JFramework 提供一个boot script 让S3 返回时获得DXE 的所有信息。这些信息是在% ]9 v. r6 U! ~
DXE 驱动正常启动过程中保存在平台的NVS 中形成的。在S3 启动过程中到NVS 中查+ x& \7 i/ B& c! J* ?/ U( X
找boot script,
( Q8 @) M: q0 a3 w: q4 _ R5 L' s找到后加载这些配置。 * ACPI 要求BIOS 加载chipset 和CPU 的配置信息
) |. V1 m# V$ |. b6 L* Chipset 的配置包括:memory,I/O 和PCI 的配置。这些信息是在DXE 启动过程
6 D H9 U6 d P! g* C; V中保存下来的。1 l: J I- f0 k+ _9 T& c3 G
* CPU 的配置包括:SMM,Microcode updates, Processor-specific initialization,
! D1 |( s" \ [Processor chache setting.
4: Framework Boot Script:7 ?1 {, } r/ [; { ]2 _3 u
Framework boot script 是一个script 用来描述一些常用的初始化平台操作。如I/O,$ P$ q0 p& ]5 ^5 h8 W) q
memory, PCI 和SMBus。
5 O1 H, ~( j2 I) S! y4 J- v7 {可能有多个boot script tables 在某些平台,这些table 描述了如何成功让平台进入/ [7 ]5 ^# O7 b* B& y
Preboot 状态。* Y) y* F! @3 Q- a! N+ J
5:S3 返回PPI 和DXE IPL PPI
/ G% m& z1 E2 F6 ~+ }& v. ~DXE IPL PPI 是最后一个被执行的PPI 在PEI 阶段,将提供正确的启动路径给
& I9 Q$ v/ u4 {0 A7 \& R0 g, fFramework。因此,DXE IPL PPI 将初始化CPU 和Preboot 平台,最后跳到OS 的% k# E: Y! K1 w0 e$ i. I& u B
呼醒向量处。在正常启动时DXE 是不会执行他的。7 j `, j8 o0 b# |1 A
在S3 返回时,DXE IPL PPI 将会定位S3 Resume PPI.如果被找到,DXE IPL PPI 将会把5 Q+ r7 D7 o0 C
控制权交给S3 Resume PPI. S3 Resume PPI 将会执行一此配置让平台进入Preboot
* P6 `6 V; h4 R0 E' L+ ^state.( l9 L z$ \; }8 Q0 R: N
S3 Resume PPI 必须执行Framework boot Script table 来加载平台配置。它负责找到OS+ [ Q. l1 A4 I; a) [3 D* b
waking vector 并且将控制权交给OS 来完成S3 返回。
+ H+ \* x7 U, ?+ n7 p# s) |在整个过程中,只有内存是S3 启动可以使用的。任何内存使用会扰乱系统的context(国
8 r/ k& g, E* X入喜欢叫他为 上下文 ),使S3 失败。4 k* n1 m5 U# X
S3 Resume PPI 需要知道如下情况:
5 `4 {! q7 `% ], ?+ G l8 E* 内存S3 boot Script Table 的地址或者firmware volume file 中S3 boot script table/ Q1 g) f2 b# e9 V$ N b
的地址。
, G; u0 R, [+ s7 j9 E# m* RSDT 指针中ACPI 开始的地址和OS 的waking vector
6 x: X. X T D$ s* @. n. s* G* 保留一段内存给S3 返回时使用。 % T7 m3 M( d, o) T8 @8 G, [
|
|