|
一:平台初始化的多个阶段:. h$ b$ g9 y! `8 X3 L
(1) Pre-EFI Initialization (PEI); ]+ M0 Y" S! r& \' m$ @
PEI 负责尽可能的初始化平台为执行DXE 做准备,
' Y% W1 Z& b- }4 u5 y(2) Driver Execution Environment (DXE), D$ X* H5 J- w/ W# T* R8 P% T5 g
在DXE 阶段可能会改变PEI 初始化的环境,有些参数会被DXE 重写。
# R6 x3 \) \7 ^8 y# p2 e8 ?/ p6 N# ]# I3 _
二:平台初始化的流程:
0 S9 K' }2 Z# }5 @' s, d(1) I/O 操作
9 `8 q6 v7 s- v5 ?+ i(2) 内存操作; g/ Z9 v X( `5 T
(3) 配置PCI 配置空间
$ g% K7 f; f1 y; A% m4 F(4) 通过PPIs 收集平台的动作。 ; \8 G) E# W- Y0 V5 `
+ K, O/ [, E$ h9 E Z$ T, l9 G/ m. s三:恢复平台状态:8 d, {% C) J6 O5 ]6 \3 }/ D
S3 返回是加载平台的Preboot 配置,加载的过程需要通过所有的Framework 初始化,因为
2 R4 _$ w, `5 w8 o$ ]5 _" xFramework 不知道以下信息% k& }& a) r( e6 Q* O- y
* PEIMs 提供的Preboot 配置
8 `4 ?8 z/ V! i, L 不同厂商提供的驱动最后Framework 还是需要像正常启动一下执行一次,执行流程' F& [# U2 L, t1 n# ?: [9 \$ d$ g% D
如下: ?/ Z- P2 i* O+ b6 \) }! I: B
) C& R; a" k: i, _- z q0 v2 E- B- W: k. d2 Z5 a! [4 ~
9 g+ W7 E, w8 c. K d
四:S3 恢复阶段的执行流程:: C g0 _ M& S5 t
SEC 是第一个被Framework 执行的,因此SEC 保存了S3 返回时的启动路径
" @$ s+ W& G, n" R/ d$ ~, X/ M1:PEI 和S3 返回的路径:2 y0 s3 e$ p: x% @" s0 K0 M
S3 返回时Framework 将加载PEI 的端口配置。PEIM 可能调用相应的PEI 服务找出正
' K7 x4 E" m* ^# }# O- L确的启动路径。PEIM 会保存配置正常的启动过程,并且利用来配置S3 的返回路' }; c. N8 u! `
径。7 O/ M& m8 S7 H/ S
8 e2 T* }! A% x$ M& H1 ?2:在PEI 过程中保存配置数据* K# k* e- d: @3 _9 F6 K! X9 Q
有很多种方法来保存配置数据,如firmware volume 变量,nonvolatile storage (NVS)! K- Y* a' x U% B
3: DXE 和S3 返回启动路径! N, E! J( [& B a
在DXE 阶段,有多种DXE 可以使平台到Preboot 阶段。让DXE 进入S3 返回启动路径 Y: k6 O4 x: B4 K& G* w7 X t+ V, A6 C
使DXE 驱动存在一定风险,原因如下: * DXE 启动有很多服务,这使它变的很庞大 v5 ^/ `9 e6 ~9 i, U( [& j
* 加载DXE 从flash 空间需要一定的时间。
如果DXE 在启动过程中能在NVS 中保存,那么DXE 需要的大量内存和复杂的" }; L8 I; v3 q. E& i5 Y1 z& Z; d, Y
DXE 启动过程就不需要执行。
" i/ `, B1 O1 \$ G' }Framework 提供一个boot script 让S3 返回时获得DXE 的所有信息。这些信息是在2 ?0 p$ { i; M7 ^2 m/ }. n( A
DXE 驱动正常启动过程中保存在平台的NVS 中形成的。在S3 启动过程中到NVS 中查7 w7 V* K6 n: l
找boot script,$ q* u6 ~ {; t
找到后加载这些配置。 * ACPI 要求BIOS 加载chipset 和CPU 的配置信息5 c- R6 R9 g, D& p0 j6 N
* Chipset 的配置包括:memory,I/O 和PCI 的配置。这些信息是在DXE 启动过程" t+ m' p4 f, Y y( x' ]; X
中保存下来的。
: w ?1 b, Q7 v# Z: O8 _- G* CPU 的配置包括:SMM,Microcode updates, Processor-specific initialization,
; s' P8 z; s, X0 j# a5 `8 |& ?, RProcessor chache setting.
4: Framework Boot Script:! s$ m1 F! n1 H
Framework boot script 是一个script 用来描述一些常用的初始化平台操作。如I/O,. B9 Z a. B( z# S o7 k' z
memory, PCI 和SMBus。
9 c" c& E- M% r, G: K2 O, {1 z: h可能有多个boot script tables 在某些平台,这些table 描述了如何成功让平台进入! s6 U* w1 A, Y3 G; _% m) [8 s: o
Preboot 状态。
. ], N# X5 P# }5:S3 返回PPI 和DXE IPL PPI! H+ q. U9 h y$ f% w, m
DXE IPL PPI 是最后一个被执行的PPI 在PEI 阶段,将提供正确的启动路径给9 ^" t. S( n, M- n4 I
Framework。因此,DXE IPL PPI 将初始化CPU 和Preboot 平台,最后跳到OS 的
& B6 H7 V+ B. ?1 @5 W% M" ^$ L呼醒向量处。在正常启动时DXE 是不会执行他的。; `: F" y H( s
在S3 返回时,DXE IPL PPI 将会定位S3 Resume PPI.如果被找到,DXE IPL PPI 将会把, i* H. l) i' Y) s' L) v _# M
控制权交给S3 Resume PPI. S3 Resume PPI 将会执行一此配置让平台进入Preboot( v( g% l5 s+ I2 O: c6 o/ s9 T
state.1 {( B2 Q. \1 M- E1 z* b c
S3 Resume PPI 必须执行Framework boot Script table 来加载平台配置。它负责找到OS
+ A3 V" S8 z5 L V1 p: hwaking vector 并且将控制权交给OS 来完成S3 返回。/ u* R" @4 {1 i9 \) A. @0 Z
在整个过程中,只有内存是S3 启动可以使用的。任何内存使用会扰乱系统的context(国
/ a) `! P5 {$ \, A( D7 K- n, f入喜欢叫他为 上下文 ),使S3 失败。
9 C4 ^( @9 j$ k3 WS3 Resume PPI 需要知道如下情况:
# x7 p$ G3 u3 N4 U( E7 R* 内存S3 boot Script Table 的地址或者firmware volume file 中S3 boot script table
2 T' A. F2 K% l e的地址。
# a8 N$ Y* @5 P9 ^ j0 E1 B$ b* RSDT 指针中ACPI 开始的地址和OS 的waking vector- \! K4 N7 A9 n2 `9 o5 E
* 保留一段内存给S3 返回时使用。
# s* Q5 @8 f0 }( y+ ^) ^
|
|