|
一:平台初始化的多个阶段:5 z) f) U! ~9 K# l
(1) Pre-EFI Initialization (PEI)
6 s O7 z- i& C$ j) r$ O8 ^, {+ yPEI 负责尽可能的初始化平台为执行DXE 做准备,
8 H3 m! w3 o0 s Q s+ N. x(2) Driver Execution Environment (DXE)
3 p1 F; V4 h. _5 `7 ~在DXE 阶段可能会改变PEI 初始化的环境,有些参数会被DXE 重写。 - Q% [! j1 w3 X7 t" g, m3 s0 a
; |* f J! o, R @& Z1 n
二:平台初始化的流程:
0 ^: z5 n8 s, t(1) I/O 操作7 l; W) h; L7 ]
(2) 内存操作5 `9 L' j( ^( H% c9 i# R3 e7 @" B
(3) 配置PCI 配置空间! _# s, e) Y! {/ X5 r
(4) 通过PPIs 收集平台的动作。 % X8 s) f' b' [7 `' [5 r4 h+ I
# ~% k9 e, l8 p. |
三:恢复平台状态:& s) p2 A4 T$ X7 \4 Y$ {% }
S3 返回是加载平台的Preboot 配置,加载的过程需要通过所有的Framework 初始化,因为# V+ F0 |( B* ^, Z' A
Framework 不知道以下信息1 y7 H) b( m/ G8 a# o
* PEIMs 提供的Preboot 配置3 X" g0 h/ W! ?' z- l& `$ b( N
不同厂商提供的驱动最后Framework 还是需要像正常启动一下执行一次,执行流程
1 [9 n' h9 O8 M如下:
+ @: O& i* W# W' W
8 G9 \6 L" n. r$ q: [1 K5 f: V( n
/ @' A! R, T+ L
四:S3 恢复阶段的执行流程:3 W, s; x# C, Z% W6 f q8 V
SEC 是第一个被Framework 执行的,因此SEC 保存了S3 返回时的启动路径
% ^& ?& [ F8 V+ i' A0 j3 V1:PEI 和S3 返回的路径:8 O/ g) J* Y! [7 {7 d
S3 返回时Framework 将加载PEI 的端口配置。PEIM 可能调用相应的PEI 服务找出正
8 Q- K& l+ q, z% ^0 m J3 }确的启动路径。PEIM 会保存配置正常的启动过程,并且利用来配置S3 的返回路
, f0 n2 \1 ?- ~5 ]# v/ E径。
1 ^/ t, l0 Q# r, c
0 ?3 p7 F" J. Z( _+ V& E2:在PEI 过程中保存配置数据
; S# `% \- f9 N; W+ {0 [有很多种方法来保存配置数据,如firmware volume 变量,nonvolatile storage (NVS)
5 N( L j& O9 @0 O3: DXE 和S3 返回启动路径
- B3 [. G6 X' j) E4 q在DXE 阶段,有多种DXE 可以使平台到Preboot 阶段。让DXE 进入S3 返回启动路径" f7 P% w+ e) u
使DXE 驱动存在一定风险,原因如下: * DXE 启动有很多服务,这使它变的很庞大
- e( ^% E& b4 b `$ R* 加载DXE 从flash 空间需要一定的时间。
如果DXE 在启动过程中能在NVS 中保存,那么DXE 需要的大量内存和复杂的
& {% D* [ F$ v& c) b+ i XDXE 启动过程就不需要执行。" K1 l3 g3 C5 J* E3 V5 h3 E( W
Framework 提供一个boot script 让S3 返回时获得DXE 的所有信息。这些信息是在
k% `( u6 n6 _1 H" m. ~4 {; o9 E: }DXE 驱动正常启动过程中保存在平台的NVS 中形成的。在S3 启动过程中到NVS 中查
. {: J. m3 k2 T# k% k$ M1 d找boot script,
0 @. L' Z% Y5 Y+ v* N找到后加载这些配置。 * ACPI 要求BIOS 加载chipset 和CPU 的配置信息) Q5 {6 B$ y5 B4 M, k3 k; z$ k
* Chipset 的配置包括:memory,I/O 和PCI 的配置。这些信息是在DXE 启动过程
% C j1 ~( ]6 W( K! x8 `中保存下来的。4 Z' e# m4 D2 J J
* CPU 的配置包括:SMM,Microcode updates, Processor-specific initialization,% K* i' R1 m( O* t. i
Processor chache setting.
4: Framework Boot Script:
, Z9 S+ G! z* D- U/ s& GFramework boot script 是一个script 用来描述一些常用的初始化平台操作。如I/O,; k4 k8 _. g2 k: c; |* ]# }% P$ s& o
memory, PCI 和SMBus。5 }+ B, T) x) B2 X3 g7 B0 u
可能有多个boot script tables 在某些平台,这些table 描述了如何成功让平台进入
* |. O7 d; ~: }. x- ~4 i2 j/ WPreboot 状态。
" l0 [' D& m* }5:S3 返回PPI 和DXE IPL PPI
- q% n+ @) q7 {# A7 XDXE IPL PPI 是最后一个被执行的PPI 在PEI 阶段,将提供正确的启动路径给
; P; s8 C* ?/ O0 v* b6 k, I1 Z: v/ }/ MFramework。因此,DXE IPL PPI 将初始化CPU 和Preboot 平台,最后跳到OS 的
, J6 w0 |; S, d' l) H$ h" @; D呼醒向量处。在正常启动时DXE 是不会执行他的。1 o9 a c2 B) ]1 K8 g- h$ H
在S3 返回时,DXE IPL PPI 将会定位S3 Resume PPI.如果被找到,DXE IPL PPI 将会把
. b5 P' D( D f m1 H9 k控制权交给S3 Resume PPI. S3 Resume PPI 将会执行一此配置让平台进入Preboot8 b3 _6 c$ ]* O" \" {) L
state.
9 A W3 U. \' `; WS3 Resume PPI 必须执行Framework boot Script table 来加载平台配置。它负责找到OS/ d' J0 |6 U3 _" j* K# o4 h
waking vector 并且将控制权交给OS 来完成S3 返回。
/ W7 h0 h3 L* s9 E! a9 }在整个过程中,只有内存是S3 启动可以使用的。任何内存使用会扰乱系统的context(国
6 @/ M5 A* o7 G- c6 c8 B, j3 O入喜欢叫他为 上下文 ),使S3 失败。
2 J4 \2 ~* u+ J7 U1 Z/ w* cS3 Resume PPI 需要知道如下情况:" x5 p$ h1 W: m, H' x" p6 O
* 内存S3 boot Script Table 的地址或者firmware volume file 中S3 boot script table9 f/ Q% O$ F. ?& R* J
的地址。
# p/ d: c9 I' U9 y* RSDT 指针中ACPI 开始的地址和OS 的waking vector
2 f7 K3 n$ ~7 W$ J2 u' J' F* 保留一段内存给S3 返回时使用。 ; H$ M3 `! D% M1 \
|
|