|
|
一:平台初始化的多个阶段:
+ `! T) k# X, o! x8 T(1) Pre-EFI Initialization (PEI)1 W& R8 C- S) q4 t- k6 |4 \
PEI 负责尽可能的初始化平台为执行DXE 做准备,
% `: o4 \8 K+ |3 U7 p( W(2) Driver Execution Environment (DXE)& T% x# ]) J3 g# b. q
在DXE 阶段可能会改变PEI 初始化的环境,有些参数会被DXE 重写。 7 v, h$ V- }/ }& O. s0 G
, ]4 n! s8 X& X& e+ C二:平台初始化的流程:8 s7 c* `: M) T. C( B9 S: A
(1) I/O 操作/ j: @4 A+ f! e7 ?# F0 b
(2) 内存操作8 H/ E; w9 r9 I2 G
(3) 配置PCI 配置空间1 G" G2 ]/ q* S+ k# B" R* t4 Z
(4) 通过PPIs 收集平台的动作。
. @9 {2 m* S" \8 o7 Z- \! Z# U% @( S/ B: x+ i5 ]
三:恢复平台状态:
; n) ~9 G. z9 J4 _% N. w- b/ ?S3 返回是加载平台的Preboot 配置,加载的过程需要通过所有的Framework 初始化,因为
* i. c& z. Z @2 z. C3 u3 HFramework 不知道以下信息 y' z: U- e M9 y) c8 o
* PEIMs 提供的Preboot 配置# ~* _0 Y8 }" i- P0 d
不同厂商提供的驱动最后Framework 还是需要像正常启动一下执行一次,执行流程
! ~* f7 d @. d! K" {5 P `如下:% W' b0 A0 I( e: e. _- u8 v1 t- j
) J" _4 ~' J4 x d# R0 S# B
, w" R% a. N' p5 i. W8 [2 g8 W( e$ A' C
/ F+ t8 c, ~* l; X6 q4 L# p四:S3 恢复阶段的执行流程:8 I% y+ R6 E$ ?4 N: O0 ?8 X
SEC 是第一个被Framework 执行的,因此SEC 保存了S3 返回时的启动路径
4 |2 V$ R) a) h( c1:PEI 和S3 返回的路径:
7 n7 ^ B) V7 tS3 返回时Framework 将加载PEI 的端口配置。PEIM 可能调用相应的PEI 服务找出正
8 }5 I* Q8 b" K# t6 h确的启动路径。PEIM 会保存配置正常的启动过程,并且利用来配置S3 的返回路, D% V. z8 R# F! x' R* L2 C! m
径。7 f) q# d3 w3 R1 q; b
) a# c, W$ C7 t2 V) S. P
2:在PEI 过程中保存配置数据# @$ F n- H( S1 t) }
有很多种方法来保存配置数据,如firmware volume 变量,nonvolatile storage (NVS): d2 p0 w9 g8 b* U
3: DXE 和S3 返回启动路径
0 B2 f! h8 \6 m在DXE 阶段,有多种DXE 可以使平台到Preboot 阶段。让DXE 进入S3 返回启动路径4 ]9 S, ~0 B, h' A
使DXE 驱动存在一定风险,原因如下: * DXE 启动有很多服务,这使它变的很庞大
' R: ^, N+ [ O" I* 加载DXE 从flash 空间需要一定的时间。
如果DXE 在启动过程中能在NVS 中保存,那么DXE 需要的大量内存和复杂的
2 t, f$ b! _2 Y& Q' bDXE 启动过程就不需要执行。& Y4 ]# J( q4 A4 p7 n
Framework 提供一个boot script 让S3 返回时获得DXE 的所有信息。这些信息是在! M6 `8 P1 l r" Z
DXE 驱动正常启动过程中保存在平台的NVS 中形成的。在S3 启动过程中到NVS 中查* z& w6 |4 D3 m8 _0 X6 O9 i
找boot script,# g9 ]* u/ S6 `
找到后加载这些配置。 * ACPI 要求BIOS 加载chipset 和CPU 的配置信息
/ C6 f. k }9 g; w& q* Chipset 的配置包括:memory,I/O 和PCI 的配置。这些信息是在DXE 启动过程
+ s9 L6 j/ M/ _/ d* D0 |0 m+ R9 v) i中保存下来的。
0 R: f! `$ t5 W+ ^6 X/ Z* `( A6 s* CPU 的配置包括:SMM,Microcode updates, Processor-specific initialization,
- f6 }9 F, d6 ?+ E. w6 `: O& w0 X5 _$ rProcessor chache setting.
4: Framework Boot Script:
' J6 y7 O$ s+ n4 ]7 H) K" E2 \6 }& NFramework boot script 是一个script 用来描述一些常用的初始化平台操作。如I/O,8 v! m, M# F% E7 @5 z' l! s& I
memory, PCI 和SMBus。9 N( T0 }7 p5 O( i e
可能有多个boot script tables 在某些平台,这些table 描述了如何成功让平台进入7 F$ p, X% k! a, }- _
Preboot 状态。" e7 ?* k/ K& A4 D. ~2 [% m
5:S3 返回PPI 和DXE IPL PPI$ R7 s1 U: R# b7 ]: _+ v
DXE IPL PPI 是最后一个被执行的PPI 在PEI 阶段,将提供正确的启动路径给- X# D) ~/ r# x4 v5 b5 @9 ~
Framework。因此,DXE IPL PPI 将初始化CPU 和Preboot 平台,最后跳到OS 的
; T: b5 c" t9 r4 \9 Z5 F- _" u( a4 \呼醒向量处。在正常启动时DXE 是不会执行他的。
$ Q3 e, B$ v! M+ U. Q0 P4 B, x( _在S3 返回时,DXE IPL PPI 将会定位S3 Resume PPI.如果被找到,DXE IPL PPI 将会把& G$ ]$ ?1 M, c; ^; j
控制权交给S3 Resume PPI. S3 Resume PPI 将会执行一此配置让平台进入Preboot5 B1 o* A" w& b0 B9 ^% y$ d
state.' @8 e, w+ r" C. r$ c: [& B2 Y
S3 Resume PPI 必须执行Framework boot Script table 来加载平台配置。它负责找到OS6 x+ N. U% [' ?: M7 Q- s0 x
waking vector 并且将控制权交给OS 来完成S3 返回。: l; e0 I- X- S
在整个过程中,只有内存是S3 启动可以使用的。任何内存使用会扰乱系统的context(国5 y. b- F. o9 @
入喜欢叫他为 上下文 ),使S3 失败。- g( L" s& B- D: y8 H: E# j7 ]2 O; L
S3 Resume PPI 需要知道如下情况:# U, ^$ Q1 {6 x3 p8 a
* 内存S3 boot Script Table 的地址或者firmware volume file 中S3 boot script table
. S5 h* e; ^, a4 Q# ~的地址。
8 m; y; I& |2 T# i1 |* RSDT 指针中ACPI 开始的地址和OS 的waking vector
7 {8 j( U8 M( p# c( X* 保留一段内存给S3 返回时使用。
; j2 A; Y( u1 a
|
|