|
|
一:平台初始化的多个阶段:
$ N9 l, V0 C- ~* E) I) P' Z6 Q(1) Pre-EFI Initialization (PEI)1 T& ^ y* R/ h% @/ p
PEI 负责尽可能的初始化平台为执行DXE 做准备,
6 Y$ N* e( J1 Z6 g/ n(2) Driver Execution Environment (DXE)" ^+ ^' I. q$ |& Y, e& X# x
在DXE 阶段可能会改变PEI 初始化的环境,有些参数会被DXE 重写。
5 U" r0 E: _0 q" _+ d/ w: M# |) X) d( e
二:平台初始化的流程:7 S C( f N) l# K* o6 N2 q3 r
(1) I/O 操作# L0 x2 t7 Z+ l5 R
(2) 内存操作. v+ [ S; A4 y! f3 E1 a2 H, u
(3) 配置PCI 配置空间
% r+ J1 N1 l5 ~ X, J(4) 通过PPIs 收集平台的动作。
8 b9 U; ]+ [ A% F) u
, Z$ ?* ?3 ?1 _' v3 _3 }三:恢复平台状态:( L# {, k) Z9 I+ A) S# d/ O; l
S3 返回是加载平台的Preboot 配置,加载的过程需要通过所有的Framework 初始化,因为
# _6 @4 M1 j( WFramework 不知道以下信息
* P1 B5 S8 G0 a. |2 L& }% Z* PEIMs 提供的Preboot 配置2 ^# r2 ~2 W0 T1 w% y
不同厂商提供的驱动最后Framework 还是需要像正常启动一下执行一次,执行流程) e) c1 i: {6 j- e% l5 R
如下:6 B; v0 _/ F5 C/ M3 G4 i
" q2 u) A$ ^ P! y: h# {3 H
1 x! z" J8 p ~/ D. x8 j6 c6 H
: i5 I7 ?7 _& N ~' F+ l- L! ~四:S3 恢复阶段的执行流程:
, A; X+ A9 b" ISEC 是第一个被Framework 执行的,因此SEC 保存了S3 返回时的启动路径
. _" c+ |/ H) M4 @& Q9 o1:PEI 和S3 返回的路径:& ]3 j: I R# {+ ^8 x7 [
S3 返回时Framework 将加载PEI 的端口配置。PEIM 可能调用相应的PEI 服务找出正* I2 Z6 _. P) w& F: V' v
确的启动路径。PEIM 会保存配置正常的启动过程,并且利用来配置S3 的返回路! M1 a- ]9 L( i$ L* @6 g! d1 ?& ^
径。. x( r. I$ z4 {" b" z# f; D
! }0 H/ T, e9 x$ i" p ?" c5 h1 E
2:在PEI 过程中保存配置数据8 D* q, ^, W: z& P4 }6 i- ^) I3 b
有很多种方法来保存配置数据,如firmware volume 变量,nonvolatile storage (NVS)- Q, c3 P. h- y3 S
3: DXE 和S3 返回启动路径
' A: w; s n9 H, e5 D, o3 J1 j在DXE 阶段,有多种DXE 可以使平台到Preboot 阶段。让DXE 进入S3 返回启动路径
% Z8 b$ u m7 }* v( ?- `使DXE 驱动存在一定风险,原因如下: * DXE 启动有很多服务,这使它变的很庞大
& z3 p4 V5 D* i+ b. e8 X* 加载DXE 从flash 空间需要一定的时间。
如果DXE 在启动过程中能在NVS 中保存,那么DXE 需要的大量内存和复杂的( r+ y. X* }% C$ K* } M1 v
DXE 启动过程就不需要执行。6 k/ t2 I& }' u+ L- \( Q
Framework 提供一个boot script 让S3 返回时获得DXE 的所有信息。这些信息是在
) I- n6 ]: @ v6 {6 Q& qDXE 驱动正常启动过程中保存在平台的NVS 中形成的。在S3 启动过程中到NVS 中查
. d6 s" X. h- M2 H! i% m! |找boot script,
1 ~2 y2 s! P1 M6 _) K找到后加载这些配置。 * ACPI 要求BIOS 加载chipset 和CPU 的配置信息% B& [+ r7 t" d! [
* Chipset 的配置包括:memory,I/O 和PCI 的配置。这些信息是在DXE 启动过程
: Y3 K6 Y9 I! ~5 d中保存下来的。5 b/ S2 b0 ?* M- \- M
* CPU 的配置包括:SMM,Microcode updates, Processor-specific initialization,
% v# I+ N) b* k; |Processor chache setting.
4: Framework Boot Script:7 L2 ~5 U+ I: p" T/ {; u
Framework boot script 是一个script 用来描述一些常用的初始化平台操作。如I/O,
% _! \/ K0 e! i; W) t: `8 v% p3 gmemory, PCI 和SMBus。
1 s f' f G/ L5 G, {: H1 N( R2 T可能有多个boot script tables 在某些平台,这些table 描述了如何成功让平台进入. Z; I0 `5 d: i) X* O. D' ?
Preboot 状态。
0 r/ D# X. h8 R1 y5:S3 返回PPI 和DXE IPL PPI
" U+ u$ t- Q ] w/ p1 [8 ^5 B, T+ PDXE IPL PPI 是最后一个被执行的PPI 在PEI 阶段,将提供正确的启动路径给
. F3 A3 ~( v8 @5 v+ S( L5 zFramework。因此,DXE IPL PPI 将初始化CPU 和Preboot 平台,最后跳到OS 的
) K% z, e2 x5 F( G) K! {3 O( S呼醒向量处。在正常启动时DXE 是不会执行他的。8 {! Q) U! J. ^% d
在S3 返回时,DXE IPL PPI 将会定位S3 Resume PPI.如果被找到,DXE IPL PPI 将会把5 h, T K8 l: x4 Q7 @8 J7 e
控制权交给S3 Resume PPI. S3 Resume PPI 将会执行一此配置让平台进入Preboot/ z7 q6 d8 D: R3 Q5 W5 p8 u" B
state.: ]$ G1 Y1 {# j6 v1 g0 r
S3 Resume PPI 必须执行Framework boot Script table 来加载平台配置。它负责找到OS
. N ~8 t1 z7 s' x; Z$ ]' l' twaking vector 并且将控制权交给OS 来完成S3 返回。
8 ?! t' C1 a5 O( Z) }+ [在整个过程中,只有内存是S3 启动可以使用的。任何内存使用会扰乱系统的context(国+ f% D& A8 U% ?$ l6 M& f# i
入喜欢叫他为 上下文 ),使S3 失败。
+ o: L; s- j& J/ r9 D3 W9 }3 L+ z- CS3 Resume PPI 需要知道如下情况:
! P* m, M; u4 l' ?* 内存S3 boot Script Table 的地址或者firmware volume file 中S3 boot script table
$ B3 R' a9 p+ C# H! c的地址。
. v! x. b8 y. G2 n0 u0 ~* RSDT 指针中ACPI 开始的地址和OS 的waking vector
) |+ i, h! @7 y% e @) ]* 保留一段内存给S3 返回时使用。
0 d" G$ l! P$ H
|
|