|
一:平台初始化的多个阶段:- K3 B& V/ R$ M& _ C
(1) Pre-EFI Initialization (PEI)+ y" a2 Y, L, X! V$ x" g
PEI 负责尽可能的初始化平台为执行DXE 做准备,+ E" f5 z0 e i) G0 C& C0 G m
(2) Driver Execution Environment (DXE)
! K" l \7 E" d$ z. H/ I8 s在DXE 阶段可能会改变PEI 初始化的环境,有些参数会被DXE 重写。
% }7 K: X* o5 f+ \0 v' c1 g% L X( }+ d/ K
二:平台初始化的流程:
9 O- S8 {6 q+ z# ~(1) I/O 操作4 Y% V4 D1 W' G! r
(2) 内存操作
' J1 X% L3 H- `3 [* U4 K8 q(3) 配置PCI 配置空间0 ]$ j `. ~; s) A% G
(4) 通过PPIs 收集平台的动作。
# l/ D8 Y/ p2 M( h( l d+ u
: p$ X/ p1 A# b) [" Y! |三:恢复平台状态:8 w$ a) |2 O: {/ L0 j. o7 \
S3 返回是加载平台的Preboot 配置,加载的过程需要通过所有的Framework 初始化,因为
6 S7 o. p% x( ^1 d9 e" v5 \( XFramework 不知道以下信息
2 R) G$ F) c2 |7 e7 _6 L" a* PEIMs 提供的Preboot 配置. x# V4 |7 y( N5 C$ Y4 L
不同厂商提供的驱动最后Framework 还是需要像正常启动一下执行一次,执行流程
( g" Q) T- \( h如下:
; K! \) g% [6 [3 Y) b! b- B
) A6 R) [! y, o4 F8 k' u& u
# x+ M) Q$ U4 {" b: ^: _' l" j9 d# l$ R' y
四:S3 恢复阶段的执行流程:5 w2 K6 T" q r
SEC 是第一个被Framework 执行的,因此SEC 保存了S3 返回时的启动路径: J4 i1 t! H) c$ y
1:PEI 和S3 返回的路径:5 c( X @. x! h
S3 返回时Framework 将加载PEI 的端口配置。PEIM 可能调用相应的PEI 服务找出正1 ]% l; Z' _! v
确的启动路径。PEIM 会保存配置正常的启动过程,并且利用来配置S3 的返回路
0 @" A. q' r( ~0 N" [径。9 U. O; D4 c, ~! b h0 t3 m
* l1 D4 l# d" l4 G
2:在PEI 过程中保存配置数据
. o0 h5 t- p/ G' |! I/ B有很多种方法来保存配置数据,如firmware volume 变量,nonvolatile storage (NVS)
/ U$ M" b0 X3 s4 {6 u3 ]$ z2 k z. ?3: DXE 和S3 返回启动路径
+ I" e* S/ e7 m" ~) {在DXE 阶段,有多种DXE 可以使平台到Preboot 阶段。让DXE 进入S3 返回启动路径
- u4 e: K8 R. ]: ^" ^$ O$ X使DXE 驱动存在一定风险,原因如下: * DXE 启动有很多服务,这使它变的很庞大& ?4 c! D" A( I' Y
* 加载DXE 从flash 空间需要一定的时间。
如果DXE 在启动过程中能在NVS 中保存,那么DXE 需要的大量内存和复杂的! _' ~" N8 Z3 T
DXE 启动过程就不需要执行。 j3 q, s. w/ T5 V- }
Framework 提供一个boot script 让S3 返回时获得DXE 的所有信息。这些信息是在
/ w6 {- l7 [0 ~ { pDXE 驱动正常启动过程中保存在平台的NVS 中形成的。在S3 启动过程中到NVS 中查
' F1 O" p$ Y, |- U9 I找boot script,, E2 F# |, p% ^6 a$ d
找到后加载这些配置。 * ACPI 要求BIOS 加载chipset 和CPU 的配置信息
' j, l+ m- i3 R5 _* Chipset 的配置包括:memory,I/O 和PCI 的配置。这些信息是在DXE 启动过程
4 Q1 u3 L t3 C; e( h中保存下来的。
# [7 v6 E7 h: G# z* S* CPU 的配置包括:SMM,Microcode updates, Processor-specific initialization,
( B. G7 x1 y4 e( p5 `$ HProcessor chache setting.
4: Framework Boot Script:
2 j$ x5 V8 K! l2 C2 H9 yFramework boot script 是一个script 用来描述一些常用的初始化平台操作。如I/O,
) _+ D' { i( E) R3 Ememory, PCI 和SMBus。
0 O# Q4 l- {1 d u8 O0 p可能有多个boot script tables 在某些平台,这些table 描述了如何成功让平台进入
9 g N( z( S5 FPreboot 状态。3 u( V+ e- K1 `, h( ?- Y! I( }3 F
5:S3 返回PPI 和DXE IPL PPI: c0 i6 y4 h/ R
DXE IPL PPI 是最后一个被执行的PPI 在PEI 阶段,将提供正确的启动路径给
; N$ a" X9 H* r7 p8 SFramework。因此,DXE IPL PPI 将初始化CPU 和Preboot 平台,最后跳到OS 的
3 f% u9 u' o8 G Q& f+ K呼醒向量处。在正常启动时DXE 是不会执行他的。
5 E: I& m" V( i! V在S3 返回时,DXE IPL PPI 将会定位S3 Resume PPI.如果被找到,DXE IPL PPI 将会把4 \) T7 \3 m1 _
控制权交给S3 Resume PPI. S3 Resume PPI 将会执行一此配置让平台进入Preboot
+ C8 ~8 a2 C9 T' V1 _5 n$ Cstate.
; x: w/ Z2 R0 K4 ~4 fS3 Resume PPI 必须执行Framework boot Script table 来加载平台配置。它负责找到OS1 Q* N( S( T% R0 ]+ \! x) z1 H' `' w
waking vector 并且将控制权交给OS 来完成S3 返回。; X5 v: a8 F- o# l
在整个过程中,只有内存是S3 启动可以使用的。任何内存使用会扰乱系统的context(国
+ \. c% A% d2 s7 @0 R入喜欢叫他为 上下文 ),使S3 失败。
% I0 p0 M. S, \# J5 BS3 Resume PPI 需要知道如下情况:4 { S& `$ j8 y3 A# m( H
* 内存S3 boot Script Table 的地址或者firmware volume file 中S3 boot script table
- J/ v: x) ~; {' P$ W" E9 V2 n的地址。
; c% F/ V6 I9 C- Z1 B1 y X* U# x# x3 h* RSDT 指针中ACPI 开始的地址和OS 的waking vector$ z; t" F0 P- P( U+ \3 j
* 保留一段内存给S3 返回时使用。 , L3 a6 Y) I; Y+ b; Z/ W
|
|