|
|
一:平台初始化的多个阶段:4 d+ y( }" A$ }/ q
(1) Pre-EFI Initialization (PEI)! @; R" _9 G, d& o* t
PEI 负责尽可能的初始化平台为执行DXE 做准备,
# C# B" T3 x7 f D: s% m(2) Driver Execution Environment (DXE)5 [1 \ }! o+ s. \# `( T
在DXE 阶段可能会改变PEI 初始化的环境,有些参数会被DXE 重写。 W B) i( P* }; `* }* Z
0 K/ E. ^1 b7 b4 n
二:平台初始化的流程:9 I% g" l' G/ y. f3 M
(1) I/O 操作
( }' |( t3 k: U( x8 I(2) 内存操作, a. u+ d ~8 I7 E! v0 `7 _( d% t
(3) 配置PCI 配置空间
; J2 ]7 |0 d1 A4 n: c(4) 通过PPIs 收集平台的动作。
$ i% e% K6 g8 f; f+ `) S
. x) X, I" r! ]$ e* j1 m4 U. A* w三:恢复平台状态:( {/ b% W+ r0 @/ ~# U
S3 返回是加载平台的Preboot 配置,加载的过程需要通过所有的Framework 初始化,因为
$ L2 K( {3 }$ X& uFramework 不知道以下信息7 L2 j- p7 B. f- O- w( m
* PEIMs 提供的Preboot 配置
! X5 ]4 _) r- |4 G1 z5 L o v 不同厂商提供的驱动最后Framework 还是需要像正常启动一下执行一次,执行流程) W2 G) l& |! q9 {* _
如下:3 J3 A2 }' t3 C% y) e
- ]; ], t0 R- G9 z. W
) f) V( p: @( j# d
/ ~% d8 r) ?) Y. W四:S3 恢复阶段的执行流程:
# l8 B7 R% ?- a- c) RSEC 是第一个被Framework 执行的,因此SEC 保存了S3 返回时的启动路径
- R6 D8 ^" ^- h8 G1 ~+ P, L+ ~( |1:PEI 和S3 返回的路径:/ ]' J2 p X$ H' F
S3 返回时Framework 将加载PEI 的端口配置。PEIM 可能调用相应的PEI 服务找出正
3 s! y; [3 q' @/ C确的启动路径。PEIM 会保存配置正常的启动过程,并且利用来配置S3 的返回路; y! {6 f( Z7 F, v1 I; e1 P) f6 l
径。
; O5 r/ l7 P8 J
& n! u4 F2 r& F& u+ T& G6 ^. s2:在PEI 过程中保存配置数据4 M, i: c! c3 c' X2 |2 r, M
有很多种方法来保存配置数据,如firmware volume 变量,nonvolatile storage (NVS)9 e. ?/ ]( c1 s4 e2 e2 T5 i; A
3: DXE 和S3 返回启动路径1 N1 c% x" h2 Z5 g$ e) _. {' d
在DXE 阶段,有多种DXE 可以使平台到Preboot 阶段。让DXE 进入S3 返回启动路径
4 }5 ^) m3 ?$ I6 T+ t使DXE 驱动存在一定风险,原因如下: * DXE 启动有很多服务,这使它变的很庞大2 n6 ~- P& m4 w% H6 L6 o
* 加载DXE 从flash 空间需要一定的时间。
如果DXE 在启动过程中能在NVS 中保存,那么DXE 需要的大量内存和复杂的- M6 i( i# `/ {- t% K
DXE 启动过程就不需要执行。
( e# m2 C3 H- gFramework 提供一个boot script 让S3 返回时获得DXE 的所有信息。这些信息是在) P- ^; I' [0 a" p6 e( z/ {$ [; Z% o" L
DXE 驱动正常启动过程中保存在平台的NVS 中形成的。在S3 启动过程中到NVS 中查
. l4 w! ]; b% I9 `4 ?5 P) s3 g找boot script,
6 @* @6 l1 D( e* o$ Y找到后加载这些配置。 * ACPI 要求BIOS 加载chipset 和CPU 的配置信息
& F w6 q$ ~( P4 F* Chipset 的配置包括:memory,I/O 和PCI 的配置。这些信息是在DXE 启动过程: |( S" `0 z. g
中保存下来的。
7 A3 O4 C6 U! |- q2 {* CPU 的配置包括:SMM,Microcode updates, Processor-specific initialization,0 I+ x* c2 \- @! w. k9 V
Processor chache setting.
4: Framework Boot Script:
9 U3 T; i/ P. ZFramework boot script 是一个script 用来描述一些常用的初始化平台操作。如I/O,; c3 f, t. A1 A
memory, PCI 和SMBus。+ z# ~$ i: w; A
可能有多个boot script tables 在某些平台,这些table 描述了如何成功让平台进入/ y7 [, k( k a6 I' R2 Y- r# ]
Preboot 状态。
4 _: o. ]- @& {4 L, q! T5:S3 返回PPI 和DXE IPL PPI+ x6 W0 m, P0 y. W0 _" `& d& `; w
DXE IPL PPI 是最后一个被执行的PPI 在PEI 阶段,将提供正确的启动路径给4 c6 ~" K7 R _ V% y
Framework。因此,DXE IPL PPI 将初始化CPU 和Preboot 平台,最后跳到OS 的; V! P4 r# E" Q5 B( i/ a# ^
呼醒向量处。在正常启动时DXE 是不会执行他的。
; Q; B, _9 I- L% w! Z( d: A2 y在S3 返回时,DXE IPL PPI 将会定位S3 Resume PPI.如果被找到,DXE IPL PPI 将会把0 E# ^7 O! s Q1 ? ]/ ^
控制权交给S3 Resume PPI. S3 Resume PPI 将会执行一此配置让平台进入Preboot
/ g% O) H/ }9 h/ ^+ [/ zstate.5 k: d" \! U' y$ E% V( P- V' F
S3 Resume PPI 必须执行Framework boot Script table 来加载平台配置。它负责找到OS
) P! R+ f: S7 S/ ~3 V1 {' fwaking vector 并且将控制权交给OS 来完成S3 返回。3 \; [0 j" m! G
在整个过程中,只有内存是S3 启动可以使用的。任何内存使用会扰乱系统的context(国" E0 j% m6 n5 T
入喜欢叫他为 上下文 ),使S3 失败。
' g8 _% |. Y1 ~2 PS3 Resume PPI 需要知道如下情况:# k( x: F7 U4 j: ?
* 内存S3 boot Script Table 的地址或者firmware volume file 中S3 boot script table
0 t' [" r+ O0 q- C' Q/ p+ B的地址。
1 O& W( }6 y+ U* RSDT 指针中ACPI 开始的地址和OS 的waking vector
% V: n2 }9 w) b( f. ]8 U: C* 保留一段内存给S3 返回时使用。
9 V- J, ~7 N- n" @, m8 i$ H# ~
|
|