|
|
一:平台初始化的多个阶段:# a7 \* i2 o5 ~8 y2 K, v/ {8 T
(1) Pre-EFI Initialization (PEI). }4 @7 ? k$ }# F
PEI 负责尽可能的初始化平台为执行DXE 做准备,
0 K* m$ H3 K( J0 u4 `, z# ?, }0 Z(2) Driver Execution Environment (DXE)
( o% [ B' y, w& Y在DXE 阶段可能会改变PEI 初始化的环境,有些参数会被DXE 重写。 ) b. i# c$ g" a8 h& j) T
4 O5 Q6 R: y# ^
二:平台初始化的流程:
4 F' d+ n% U9 W(1) I/O 操作* a( Q! r. o: u# H2 a1 o
(2) 内存操作7 N |: M6 f+ b
(3) 配置PCI 配置空间
, S* ?9 f+ h0 O(4) 通过PPIs 收集平台的动作。
0 w9 `5 p, Y' r* ~$ X2 c! B: o) U5 m
三:恢复平台状态:5 `3 p1 \" ~) \6 r8 a
S3 返回是加载平台的Preboot 配置,加载的过程需要通过所有的Framework 初始化,因为
) `. ]. v( [" ~$ W/ L4 ~9 r cFramework 不知道以下信息; F. q9 p7 |" b" d
* PEIMs 提供的Preboot 配置4 h t: e+ ?* S7 `- w' ]
不同厂商提供的驱动最后Framework 还是需要像正常启动一下执行一次,执行流程
9 W, D* X, U( E1 P" J如下:
2 M% ~8 j6 z/ s% E. l
; H+ l$ M( D- i
' p$ ?8 ~/ r) p9 `- X5 b0 n
$ ?) K( n& \5 i5 U5 j四:S3 恢复阶段的执行流程:- Z3 k2 B L0 m' \/ X; ~$ C
SEC 是第一个被Framework 执行的,因此SEC 保存了S3 返回时的启动路径5 D4 T4 G: j4 w0 P: s3 j
1:PEI 和S3 返回的路径:; W9 f7 v c& V* e$ A# x; r
S3 返回时Framework 将加载PEI 的端口配置。PEIM 可能调用相应的PEI 服务找出正, p( n' l5 k, @4 V7 p! r
确的启动路径。PEIM 会保存配置正常的启动过程,并且利用来配置S3 的返回路
3 F( k3 E3 g* G' R# y$ c径。& B% d2 y8 a7 g( M9 P0 i
5 X" b( x' }0 h7 c1 S" p% _
2:在PEI 过程中保存配置数据4 y! h% |- X2 z; j& U
有很多种方法来保存配置数据,如firmware volume 变量,nonvolatile storage (NVS)1 U* ?* T5 K0 \4 a$ e/ f
3: DXE 和S3 返回启动路径8 h; h, J; z2 M- R
在DXE 阶段,有多种DXE 可以使平台到Preboot 阶段。让DXE 进入S3 返回启动路径2 }/ B% h& z8 [' i3 c/ ~
使DXE 驱动存在一定风险,原因如下: * DXE 启动有很多服务,这使它变的很庞大
0 C, i/ T: y% p1 l3 i7 O/ V* 加载DXE 从flash 空间需要一定的时间。
如果DXE 在启动过程中能在NVS 中保存,那么DXE 需要的大量内存和复杂的
) S7 q0 e; X4 n4 ZDXE 启动过程就不需要执行。
' j7 I, i( ^8 Y# f! J$ a# BFramework 提供一个boot script 让S3 返回时获得DXE 的所有信息。这些信息是在0 |. Q; f8 ?: C. w2 @) C
DXE 驱动正常启动过程中保存在平台的NVS 中形成的。在S3 启动过程中到NVS 中查* r7 G1 G' e7 F* V$ w# A
找boot script,+ [4 E; b* P( c
找到后加载这些配置。 * ACPI 要求BIOS 加载chipset 和CPU 的配置信息% } a; z! Y- H. J) @
* Chipset 的配置包括:memory,I/O 和PCI 的配置。这些信息是在DXE 启动过程
* |) r7 ^- p# B& ?$ E! ~中保存下来的。
9 D `! Q0 \3 p% w( a# \3 G4 j* CPU 的配置包括:SMM,Microcode updates, Processor-specific initialization,0 S1 f! Q* s( _! i9 c4 n
Processor chache setting.
4: Framework Boot Script: ]9 ]& Y+ E1 g) [" h
Framework boot script 是一个script 用来描述一些常用的初始化平台操作。如I/O," n# u5 V+ Z6 d$ z1 j( r$ a
memory, PCI 和SMBus。6 S& l: [) L% _- C$ d
可能有多个boot script tables 在某些平台,这些table 描述了如何成功让平台进入
; p6 V" c; f* D" _* a) Y4 oPreboot 状态。" b3 R) l4 |* l/ d( t
5:S3 返回PPI 和DXE IPL PPI
8 V2 z& {$ L0 H) Q1 I5 N) }1 V! g3 CDXE IPL PPI 是最后一个被执行的PPI 在PEI 阶段,将提供正确的启动路径给
. p6 v, Z/ T D1 | t- V5 mFramework。因此,DXE IPL PPI 将初始化CPU 和Preboot 平台,最后跳到OS 的$ h4 U. v6 q) h8 X; r, l& M8 f
呼醒向量处。在正常启动时DXE 是不会执行他的。+ m3 n3 @! @2 C/ @4 K
在S3 返回时,DXE IPL PPI 将会定位S3 Resume PPI.如果被找到,DXE IPL PPI 将会把8 B* o. v0 L3 v" y5 t$ d6 k
控制权交给S3 Resume PPI. S3 Resume PPI 将会执行一此配置让平台进入Preboot$ C6 [8 L5 [7 [. I# h
state.
0 d) G0 p* g( O" j' j/ ZS3 Resume PPI 必须执行Framework boot Script table 来加载平台配置。它负责找到OS" F# L7 ~& @+ E( r
waking vector 并且将控制权交给OS 来完成S3 返回。
! S) G/ ], _3 ^+ C4 u! R$ o在整个过程中,只有内存是S3 启动可以使用的。任何内存使用会扰乱系统的context(国$ K9 J [& z; T. j1 T
入喜欢叫他为 上下文 ),使S3 失败。
2 E3 y3 S" h' B& q9 cS3 Resume PPI 需要知道如下情况:$ Z. ?3 Y9 V, z" n* b _3 z* A A
* 内存S3 boot Script Table 的地址或者firmware volume file 中S3 boot script table8 ]; K: ?0 T9 n# O r* y8 a0 w& V
的地址。7 _" ^) s2 e5 m/ G- Q8 `: Z" _" ]
* RSDT 指针中ACPI 开始的地址和OS 的waking vector
! u) T6 ?5 v+ l. E1 i" s& Y* 保留一段内存给S3 返回时使用。
( v9 T' x7 x9 ~6 B
|
|