|
|
一:平台初始化的多个阶段:
5 g0 X8 p! w0 ^# A9 ^" w9 l" Q8 d4 R(1) Pre-EFI Initialization (PEI)& b( b2 G, m* e; C
PEI 负责尽可能的初始化平台为执行DXE 做准备,) B0 @% s1 L5 [' z7 U8 q
(2) Driver Execution Environment (DXE)- n" m" k0 o M0 Z7 T
在DXE 阶段可能会改变PEI 初始化的环境,有些参数会被DXE 重写。 , F5 N& _/ S C9 V
. q' O* h' e: M6 e二:平台初始化的流程:/ I% c! x" s0 c( X8 F
(1) I/O 操作
* J; g& D; N1 R(2) 内存操作6 e1 U2 g: ^3 H' p# A; d
(3) 配置PCI 配置空间+ g) l, t5 R3 l h, S) q0 S
(4) 通过PPIs 收集平台的动作。
9 A3 h2 ]6 h; M3 d6 J0 x7 N4 N4 s( I; m) E
三:恢复平台状态:
. S8 k# b y/ d, xS3 返回是加载平台的Preboot 配置,加载的过程需要通过所有的Framework 初始化,因为0 r3 O1 h- e* }$ m/ u; m
Framework 不知道以下信息: g3 K" p8 ]; H- G) D. ^
* PEIMs 提供的Preboot 配置
+ ^8 H3 V7 B! M1 P# {: S* o 不同厂商提供的驱动最后Framework 还是需要像正常启动一下执行一次,执行流程
. a( X' @/ [& e( F* }+ Z+ @0 P) Y1 E如下:
4 K% A5 x8 n( R5 C, e
% e9 i2 v- B# v: O/ x$ ]' N0 [
! j& G7 w6 j$ G3 k8 {' q3 b7 F- f" I3 o b. y. g
四:S3 恢复阶段的执行流程:: {1 Y8 q* D1 b* N
SEC 是第一个被Framework 执行的,因此SEC 保存了S3 返回时的启动路径
/ v8 |0 {" Y( C- B1:PEI 和S3 返回的路径:" [& |, z6 ?+ s( g. l
S3 返回时Framework 将加载PEI 的端口配置。PEIM 可能调用相应的PEI 服务找出正 b I B+ {0 m
确的启动路径。PEIM 会保存配置正常的启动过程,并且利用来配置S3 的返回路
6 L: f8 M: O6 a( H) z0 G% _6 {径。
4 [/ u6 _* Y5 p* r1 }
, J b( S V. l" u2 r. J) q. W
2:在PEI 过程中保存配置数据& j: N# t# U5 r. p" u3 \
有很多种方法来保存配置数据,如firmware volume 变量,nonvolatile storage (NVS)
9 l$ J+ h7 t1 t* T' z# ~1 l0 l3: DXE 和S3 返回启动路径" W' C+ f3 ?0 E, }
在DXE 阶段,有多种DXE 可以使平台到Preboot 阶段。让DXE 进入S3 返回启动路径
+ T/ W4 ?; B- o/ N- l; Z) `使DXE 驱动存在一定风险,原因如下: * DXE 启动有很多服务,这使它变的很庞大
: ~) G* A3 D, Q* 加载DXE 从flash 空间需要一定的时间。
如果DXE 在启动过程中能在NVS 中保存,那么DXE 需要的大量内存和复杂的/ X4 p) N( B" y u; U. a" G( _* j
DXE 启动过程就不需要执行。. r2 o3 Y6 P) z- D! q2 C5 P
Framework 提供一个boot script 让S3 返回时获得DXE 的所有信息。这些信息是在
4 f8 g: o7 ~8 s& { qDXE 驱动正常启动过程中保存在平台的NVS 中形成的。在S3 启动过程中到NVS 中查% d6 g0 |0 ?" ^, o& ?
找boot script,' V8 M' P* X5 u' F
找到后加载这些配置。 * ACPI 要求BIOS 加载chipset 和CPU 的配置信息
+ N. ]9 ~# m- u/ [* Chipset 的配置包括:memory,I/O 和PCI 的配置。这些信息是在DXE 启动过程
8 x5 A' A2 ~& S中保存下来的。
. l7 G# b, D- m- c9 O% R* CPU 的配置包括:SMM,Microcode updates, Processor-specific initialization,
2 @ `9 f2 Q) P5 ~Processor chache setting.
4: Framework Boot Script:: l- C6 y5 L% Z6 \. i6 k" U
Framework boot script 是一个script 用来描述一些常用的初始化平台操作。如I/O,$ Y0 q* }" |- O% [2 `
memory, PCI 和SMBus。
% m5 n! `/ k( H; R: Q+ p) X可能有多个boot script tables 在某些平台,这些table 描述了如何成功让平台进入% g! E4 _9 c7 y' r% e
Preboot 状态。
- N' {* N# D* ?5:S3 返回PPI 和DXE IPL PPI
' g* d/ N( N8 iDXE IPL PPI 是最后一个被执行的PPI 在PEI 阶段,将提供正确的启动路径给: U: o2 E6 u. _5 i0 I
Framework。因此,DXE IPL PPI 将初始化CPU 和Preboot 平台,最后跳到OS 的8 z( Q3 o, F7 Q* j* v
呼醒向量处。在正常启动时DXE 是不会执行他的。$ j0 x5 `; r9 l& x" p) ]1 l" R
在S3 返回时,DXE IPL PPI 将会定位S3 Resume PPI.如果被找到,DXE IPL PPI 将会把* k2 g) A; Q4 e
控制权交给S3 Resume PPI. S3 Resume PPI 将会执行一此配置让平台进入Preboot
2 Y2 B$ J9 x5 V: s* U% w/ Mstate.7 l/ ~% i* |9 s, m1 N2 ~" I; U
S3 Resume PPI 必须执行Framework boot Script table 来加载平台配置。它负责找到OS+ `, W6 d) ]# Q3 l) K, b3 B8 x) ^
waking vector 并且将控制权交给OS 来完成S3 返回。# c; A- P. w. r; r# f" A" x0 M
在整个过程中,只有内存是S3 启动可以使用的。任何内存使用会扰乱系统的context(国- L( |0 T+ a2 Z% f$ F
入喜欢叫他为 上下文 ),使S3 失败。
$ S4 C3 G; P" r) z, ?+ f" p& \& XS3 Resume PPI 需要知道如下情况:3 o# u0 m$ }3 K% h G' [ f9 S
* 内存S3 boot Script Table 的地址或者firmware volume file 中S3 boot script table
: [% v6 W, p( \3 s8 S的地址。5 J) d; S |6 B- K
* RSDT 指针中ACPI 开始的地址和OS 的waking vector. @1 F& X* \1 O. ?
* 保留一段内存给S3 返回时使用。 1 \0 C% O7 {2 x1 `1 B
|
|