|
一:平台初始化的多个阶段:
: K8 ]; `6 F. h, Y, ?, h(1) Pre-EFI Initialization (PEI); O' l5 M: A6 ]2 {/ Z( a, l
PEI 负责尽可能的初始化平台为执行DXE 做准备,) s' u, L2 Z. D& l9 A1 d6 [: Z5 t/ g( ~9 z
(2) Driver Execution Environment (DXE)& }' Q/ s1 w: F: t: e/ e4 i$ z1 \
在DXE 阶段可能会改变PEI 初始化的环境,有些参数会被DXE 重写。
6 S8 D+ g0 Q7 b: T# Y, I! a0 q
( @. A0 |7 ~3 I$ K$ x D. z( Z二:平台初始化的流程:* d* i9 Y* W4 g3 `
(1) I/O 操作
! L* L0 Z: f E% K, H(2) 内存操作
: r( N5 B+ @% e/ u- n |! H5 ](3) 配置PCI 配置空间& Z0 @; u/ V* S' X
(4) 通过PPIs 收集平台的动作。 1 k; e# g, f. ^3 _. ?$ e
* E; h+ e% f+ Q' \; e三:恢复平台状态:& {' ?- J2 }# s$ l% _2 G. ?( A
S3 返回是加载平台的Preboot 配置,加载的过程需要通过所有的Framework 初始化,因为
w2 P- d; y# n k* kFramework 不知道以下信息
9 {' X# q/ M5 p9 ^' v5 F# y8 D* PEIMs 提供的Preboot 配置4 B3 O' E/ K' E- c9 e+ @1 ~
不同厂商提供的驱动最后Framework 还是需要像正常启动一下执行一次,执行流程+ l# r# P; j- v8 a- {' W
如下:( g: E$ g. o+ n# D6 {: c. `1 |- w
3 Z0 X0 @9 n y4 ]
o4 @1 K8 l& G3 }; o
: U/ d' s3 C0 z- A% U: W& f0 j四:S3 恢复阶段的执行流程:
. t& t! t$ {' g J d$ t& J. ZSEC 是第一个被Framework 执行的,因此SEC 保存了S3 返回时的启动路径+ m. ]; I1 V) r& ~: W
1:PEI 和S3 返回的路径:
R Y4 S$ y E8 x+ F3 z: gS3 返回时Framework 将加载PEI 的端口配置。PEIM 可能调用相应的PEI 服务找出正. ]9 {1 I! L* `7 D2 l7 \& S, ?/ X
确的启动路径。PEIM 会保存配置正常的启动过程,并且利用来配置S3 的返回路5 G4 H. V% `: l% u8 ?
径。/ L5 G% L- [! j1 f* R% _- I
6 \ Q# B T0 n* C: C' }: I2 |: S# B3 B2:在PEI 过程中保存配置数据
0 {8 ^. P5 E @& h N _有很多种方法来保存配置数据,如firmware volume 变量,nonvolatile storage (NVS)
( Y, L) S4 z' x' P3: DXE 和S3 返回启动路径
& f* a, k; H% A在DXE 阶段,有多种DXE 可以使平台到Preboot 阶段。让DXE 进入S3 返回启动路径5 i2 m% S1 I6 [8 f9 P! F- {
使DXE 驱动存在一定风险,原因如下: * DXE 启动有很多服务,这使它变的很庞大( q8 ` u* \& Y4 o' Z' s
* 加载DXE 从flash 空间需要一定的时间。
如果DXE 在启动过程中能在NVS 中保存,那么DXE 需要的大量内存和复杂的
& h4 Q. u5 h* q1 |DXE 启动过程就不需要执行。3 p' |9 Z# t+ g
Framework 提供一个boot script 让S3 返回时获得DXE 的所有信息。这些信息是在
) j4 l4 ~: b" Z" \+ w- g: c* {DXE 驱动正常启动过程中保存在平台的NVS 中形成的。在S3 启动过程中到NVS 中查
3 n- M' n, n% s0 i+ G找boot script,$ `( D9 o6 ~) a0 j5 o
找到后加载这些配置。 * ACPI 要求BIOS 加载chipset 和CPU 的配置信息6 Y7 U" p+ m# ^5 W0 }
* Chipset 的配置包括:memory,I/O 和PCI 的配置。这些信息是在DXE 启动过程9 h7 G; F: H" z' x. n
中保存下来的。7 `# u7 l' |! [
* CPU 的配置包括:SMM,Microcode updates, Processor-specific initialization,7 q6 a' L2 r! ^+ D, ]
Processor chache setting.
4: Framework Boot Script:! ?5 k' I9 }% H
Framework boot script 是一个script 用来描述一些常用的初始化平台操作。如I/O,
8 X8 q, |: S8 \memory, PCI 和SMBus。' I( W$ h" e4 @8 T- h. K! j
可能有多个boot script tables 在某些平台,这些table 描述了如何成功让平台进入: y" R' w# h% a' Z' X; _
Preboot 状态。
8 W5 A5 ?# U- v/ ?8 ~+ I: ?5:S3 返回PPI 和DXE IPL PPI5 ~6 J2 N9 u2 J5 X; I
DXE IPL PPI 是最后一个被执行的PPI 在PEI 阶段,将提供正确的启动路径给
. w! c) B# Q0 }9 k/ mFramework。因此,DXE IPL PPI 将初始化CPU 和Preboot 平台,最后跳到OS 的( |8 _" _8 M, R* ]; q8 o. d! R
呼醒向量处。在正常启动时DXE 是不会执行他的。
4 Y% t+ B0 a: l在S3 返回时,DXE IPL PPI 将会定位S3 Resume PPI.如果被找到,DXE IPL PPI 将会把$ e! S/ w5 r& S, J, h( y' E
控制权交给S3 Resume PPI. S3 Resume PPI 将会执行一此配置让平台进入Preboot
( }9 j* G# S& {$ e6 ~state.8 B D( k1 `: ]7 J, D0 u3 z
S3 Resume PPI 必须执行Framework boot Script table 来加载平台配置。它负责找到OS7 `) S+ y: J. L$ F* e8 W
waking vector 并且将控制权交给OS 来完成S3 返回。9 j# x( B! L$ A& D) E5 p$ N
在整个过程中,只有内存是S3 启动可以使用的。任何内存使用会扰乱系统的context(国" r2 F- C$ ^7 p0 l# q' H
入喜欢叫他为 上下文 ),使S3 失败。
/ C& Q: Z1 M6 z+ N+ @- KS3 Resume PPI 需要知道如下情况:
$ o! i, M& c9 w. |* 内存S3 boot Script Table 的地址或者firmware volume file 中S3 boot script table
1 X, t$ p6 t. x% t. }的地址。7 K, a2 W; v& Y- e( x! S& e
* RSDT 指针中ACPI 开始的地址和OS 的waking vector2 v8 W, X: f+ c; u* x
* 保留一段内存给S3 返回时使用。 + r3 }; T0 b0 [9 \
|
|