|
|
一:平台初始化的多个阶段:
( w/ ?' D# H+ z. g3 v8 ](1) Pre-EFI Initialization (PEI)
- L6 |! b) A) @PEI 负责尽可能的初始化平台为执行DXE 做准备,
% C) N5 g6 m% F9 G6 o(2) Driver Execution Environment (DXE)
% m& `- V4 [$ w5 {7 K在DXE 阶段可能会改变PEI 初始化的环境,有些参数会被DXE 重写。
& U T1 s4 x: T5 R1 r2 X% O, Q" K
二:平台初始化的流程:8 Q. \* V7 f5 c* Y
(1) I/O 操作
, Q7 n9 t5 ?7 \' n9 y(2) 内存操作
" g {6 V4 r' [* V/ u, ?( M4 \* v0 ](3) 配置PCI 配置空间
) Y$ d" w0 S8 l(4) 通过PPIs 收集平台的动作。 5 H* Q/ w% a) m( I( ?2 J
; y' D& g \2 i( f
三:恢复平台状态:& w$ e3 i0 l; u1 e0 E6 z
S3 返回是加载平台的Preboot 配置,加载的过程需要通过所有的Framework 初始化,因为
# L7 W8 n b, J2 R' sFramework 不知道以下信息( G5 a# A( N, w) Q l
* PEIMs 提供的Preboot 配置: R/ w: Y: z' F
不同厂商提供的驱动最后Framework 还是需要像正常启动一下执行一次,执行流程
5 j0 K& v. V; p& g. E. L+ H) S6 P如下:! _/ D& p9 [/ ~! v; H/ V$ a0 I
# ^- ]" V6 U y1 ?; ~
8 ]5 K& C9 m! u7 P
* k; }% R; J& k2 T
四:S3 恢复阶段的执行流程:3 B' z* A0 n4 S& y+ J9 I, s
SEC 是第一个被Framework 执行的,因此SEC 保存了S3 返回时的启动路径: Y: s4 N& m: |; D# r# |" G4 h" A
1:PEI 和S3 返回的路径:! `- s6 }9 s H1 x# }) B9 j( x
S3 返回时Framework 将加载PEI 的端口配置。PEIM 可能调用相应的PEI 服务找出正5 f/ K: I4 `$ a/ o# D* l6 k
确的启动路径。PEIM 会保存配置正常的启动过程,并且利用来配置S3 的返回路
" \( W% A# F2 F2 U! \径。
2 Y2 ]. Q6 b Q7 S
" r+ u4 o. h. O% o6 s- [3 V
2:在PEI 过程中保存配置数据" q3 X, I+ E/ u' R
有很多种方法来保存配置数据,如firmware volume 变量,nonvolatile storage (NVS)
7 f/ P/ g5 b) i; E3: DXE 和S3 返回启动路径8 k$ c b! m) z; v. _9 g6 ?
在DXE 阶段,有多种DXE 可以使平台到Preboot 阶段。让DXE 进入S3 返回启动路径
- W) @" c ~0 T" o O- s) C9 V使DXE 驱动存在一定风险,原因如下: * DXE 启动有很多服务,这使它变的很庞大
; _: o; q$ R) f1 k) I* 加载DXE 从flash 空间需要一定的时间。
如果DXE 在启动过程中能在NVS 中保存,那么DXE 需要的大量内存和复杂的
Q3 e% g5 ~ S- m2 zDXE 启动过程就不需要执行。
* F" j2 B/ E& UFramework 提供一个boot script 让S3 返回时获得DXE 的所有信息。这些信息是在
5 Z4 p/ d+ K; \, LDXE 驱动正常启动过程中保存在平台的NVS 中形成的。在S3 启动过程中到NVS 中查* p0 j. f4 _, q& S
找boot script,
. `4 R4 W+ o$ F* G- n9 F找到后加载这些配置。 * ACPI 要求BIOS 加载chipset 和CPU 的配置信息
+ o% O' U0 b2 D' g% s* Chipset 的配置包括:memory,I/O 和PCI 的配置。这些信息是在DXE 启动过程
9 I; G+ v$ ?! m+ b中保存下来的。
- B, q$ ?: R) z4 h9 }9 s6 @* CPU 的配置包括:SMM,Microcode updates, Processor-specific initialization,
* C X& z3 V8 B0 |9 v* {2 IProcessor chache setting.
4: Framework Boot Script:, [' A3 ~6 \! F
Framework boot script 是一个script 用来描述一些常用的初始化平台操作。如I/O,* O# P- ^/ l9 T& P4 V" f
memory, PCI 和SMBus。' r* v I Z! }# J" O* `# n
可能有多个boot script tables 在某些平台,这些table 描述了如何成功让平台进入6 G+ y( T- x# o) ]: A# }7 O4 r
Preboot 状态。
8 n& [+ W( U: k# v% E2 U6 A$ |5:S3 返回PPI 和DXE IPL PPI
& L) h) u3 @3 c; ?0 C% r! ?+ gDXE IPL PPI 是最后一个被执行的PPI 在PEI 阶段,将提供正确的启动路径给1 _6 Y9 b) [9 Q4 i3 a0 t* Q7 @
Framework。因此,DXE IPL PPI 将初始化CPU 和Preboot 平台,最后跳到OS 的
3 C' T$ t3 C) ~呼醒向量处。在正常启动时DXE 是不会执行他的。
* f d* N1 `0 s) m+ }/ Y4 h7 g7 {在S3 返回时,DXE IPL PPI 将会定位S3 Resume PPI.如果被找到,DXE IPL PPI 将会把- S3 O( w" O9 E/ U: \6 u
控制权交给S3 Resume PPI. S3 Resume PPI 将会执行一此配置让平台进入Preboot/ ]1 y& L# R8 E
state.; m' k. V$ Y# b! |/ r* F' J
S3 Resume PPI 必须执行Framework boot Script table 来加载平台配置。它负责找到OS. t5 p1 }7 w( P0 w, Z: ]
waking vector 并且将控制权交给OS 来完成S3 返回。' Z3 O( f+ l- k2 d7 e3 c
在整个过程中,只有内存是S3 启动可以使用的。任何内存使用会扰乱系统的context(国; J6 e [+ N3 L/ U
入喜欢叫他为 上下文 ),使S3 失败。0 n0 h8 e! l( @" W; f
S3 Resume PPI 需要知道如下情况:
. O& ~% C7 r5 e) C* 内存S3 boot Script Table 的地址或者firmware volume file 中S3 boot script table1 K: Q0 A2 C; e& n1 Q1 J/ W4 w
的地址。
( F+ j9 ?7 _% E* RSDT 指针中ACPI 开始的地址和OS 的waking vector
5 }# M$ n( ?. R) A0 h/ s4 J* 保留一段内存给S3 返回时使用。 8 ?, R: M: x$ v2 n! b5 e5 V* l3 J0 U
|
|