|
|
一:平台初始化的多个阶段: p+ `6 q- p" c/ |: Z
(1) Pre-EFI Initialization (PEI)5 W' l% @( Z( V v
PEI 负责尽可能的初始化平台为执行DXE 做准备,
9 G9 i X0 \5 ?1 F9 K2 X1 K(2) Driver Execution Environment (DXE)
- X( F5 B2 w# |4 R2 b. P在DXE 阶段可能会改变PEI 初始化的环境,有些参数会被DXE 重写。
: }/ g7 g9 o+ s3 S
9 w5 b Y* X1 X' k! _( O二:平台初始化的流程:
/ t; w# F9 q) y; ?5 F! }(1) I/O 操作0 f- U, f+ k. z! J1 J
(2) 内存操作( y( F5 F; [# j3 h/ \# l( O: p' U
(3) 配置PCI 配置空间2 K1 L0 }- X2 P$ S: D
(4) 通过PPIs 收集平台的动作。
+ h: M( E. B. I% T8 p
x/ w/ |1 p. z4 i7 {( o9 r, y三:恢复平台状态:( s# y2 ~, ~0 [0 k
S3 返回是加载平台的Preboot 配置,加载的过程需要通过所有的Framework 初始化,因为) \0 Y. V: E: Z# c9 p
Framework 不知道以下信息5 w) c, E# t: Z* R) ~
* PEIMs 提供的Preboot 配置1 R- G8 X* k. K% [+ F* S
不同厂商提供的驱动最后Framework 还是需要像正常启动一下执行一次,执行流程
4 i4 U ]' k2 i. Q- G4 w6 O如下:
9 q; ~! T; S% J. d7 U
; R' h0 r9 \1 z' G& M# O0 ?/ C1 t: \& |8 e* I- ?3 R- N5 N
3 }; X$ f) q$ K0 x# k+ |1 V B) A# p四:S3 恢复阶段的执行流程:1 \1 A+ ~" Y _) k
SEC 是第一个被Framework 执行的,因此SEC 保存了S3 返回时的启动路径
" c* m5 h4 h' P1:PEI 和S3 返回的路径:
0 c4 l4 h, N! o1 `S3 返回时Framework 将加载PEI 的端口配置。PEIM 可能调用相应的PEI 服务找出正
( J& A2 @: t! F0 ]/ g! [, Q- ?" I确的启动路径。PEIM 会保存配置正常的启动过程,并且利用来配置S3 的返回路0 ]% D4 r. p- X# i
径。
( v4 E# X1 ^. r! y
Z8 C; o- N0 y' ]8 [, j2:在PEI 过程中保存配置数据/ O: J/ X7 Z; w0 i% C8 l
有很多种方法来保存配置数据,如firmware volume 变量,nonvolatile storage (NVS)1 p0 j) E1 C2 W A
3: DXE 和S3 返回启动路径
- A7 m, Q. q p4 h; i在DXE 阶段,有多种DXE 可以使平台到Preboot 阶段。让DXE 进入S3 返回启动路径7 A) G! b$ i$ i u' \' D
使DXE 驱动存在一定风险,原因如下: * DXE 启动有很多服务,这使它变的很庞大3 b( u" y+ z- ~! T1 E
* 加载DXE 从flash 空间需要一定的时间。
如果DXE 在启动过程中能在NVS 中保存,那么DXE 需要的大量内存和复杂的8 q3 |: K5 j0 P, q
DXE 启动过程就不需要执行。
- a4 E5 R8 G7 h9 S0 ]Framework 提供一个boot script 让S3 返回时获得DXE 的所有信息。这些信息是在
" a1 R! X( F, q: HDXE 驱动正常启动过程中保存在平台的NVS 中形成的。在S3 启动过程中到NVS 中查
! Y- t+ c! R, V7 j) h找boot script,+ k9 p- a7 c7 S! Y# b
找到后加载这些配置。 * ACPI 要求BIOS 加载chipset 和CPU 的配置信息
' H( Q9 q$ N, k* Chipset 的配置包括:memory,I/O 和PCI 的配置。这些信息是在DXE 启动过程
- B) U6 Q5 I7 K7 [( F中保存下来的。
; I9 z: a0 i) h$ y" h5 K! a* CPU 的配置包括:SMM,Microcode updates, Processor-specific initialization,0 s" {. ]2 O6 z- y9 W2 {8 v
Processor chache setting.
4: Framework Boot Script:1 X9 O4 `& D* k7 y/ @/ B
Framework boot script 是一个script 用来描述一些常用的初始化平台操作。如I/O,
# h( o+ Z7 v S# I' |- P" v% e' F- Gmemory, PCI 和SMBus。
1 Z f$ T1 Q, w可能有多个boot script tables 在某些平台,这些table 描述了如何成功让平台进入
( V+ }7 r2 v0 pPreboot 状态。7 J% a( G }: o' N9 J
5:S3 返回PPI 和DXE IPL PPI
! V1 C! j1 U# m! e9 |2 Q# f: kDXE IPL PPI 是最后一个被执行的PPI 在PEI 阶段,将提供正确的启动路径给2 i( P* A! r+ J/ ^* Z) E2 m, B
Framework。因此,DXE IPL PPI 将初始化CPU 和Preboot 平台,最后跳到OS 的
: Y% A: o. V. R* I) ~呼醒向量处。在正常启动时DXE 是不会执行他的。
; x( y ~; H2 {在S3 返回时,DXE IPL PPI 将会定位S3 Resume PPI.如果被找到,DXE IPL PPI 将会把
' V( b0 _6 u" a( J7 y x4 g控制权交给S3 Resume PPI. S3 Resume PPI 将会执行一此配置让平台进入Preboot
5 L' \ w+ `+ r- U7 Ostate.1 @5 u% F9 J$ C0 ~( A! N/ \
S3 Resume PPI 必须执行Framework boot Script table 来加载平台配置。它负责找到OS
: j7 n( N& `* `waking vector 并且将控制权交给OS 来完成S3 返回。
) n% j/ _* i3 F5 b* s在整个过程中,只有内存是S3 启动可以使用的。任何内存使用会扰乱系统的context(国+ l" E8 c- V3 E. T b# T8 [
入喜欢叫他为 上下文 ),使S3 失败。
7 A8 r" ]5 A# B- C8 s8 K% WS3 Resume PPI 需要知道如下情况:" i" D0 s" I- c- h$ c% y8 a. ]
* 内存S3 boot Script Table 的地址或者firmware volume file 中S3 boot script table
; k. j7 O }9 }0 k2 ]0 X& H的地址。( h) G d$ w/ B9 p E
* RSDT 指针中ACPI 开始的地址和OS 的waking vector
2 Y6 i' ^5 k8 S# ^* 保留一段内存给S3 返回时使用。
3 V+ N6 {$ h: W* E
|
|