|
|
一:平台初始化的多个阶段:
4 s: o/ ?" F; E- M" a9 M' B- l9 R(1) Pre-EFI Initialization (PEI)
1 F! }+ Z3 u4 F5 ]PEI 负责尽可能的初始化平台为执行DXE 做准备, A0 j' J4 ~- d9 y% n( o
(2) Driver Execution Environment (DXE)
+ r! |' [4 h3 N& c5 q) h在DXE 阶段可能会改变PEI 初始化的环境,有些参数会被DXE 重写。
5 j8 i6 w; V2 v, |1 V$ Y9 B0 J- w% W! L+ n+ N8 |# y
二:平台初始化的流程:
6 ` k! G3 S" Z& Z8 z w; B(1) I/O 操作( G; o+ V/ e, Z8 B+ x
(2) 内存操作
2 F3 ~$ Z2 I+ Q( ]3 l* u(3) 配置PCI 配置空间) J8 ~7 \4 m- h, z: t- d! ]4 o# i: k
(4) 通过PPIs 收集平台的动作。
) c! k3 C2 @ x: v) ]2 P& N% i. z; a! k/ s' E( i1 z
三:恢复平台状态:9 _0 Y, n5 O' j# g
S3 返回是加载平台的Preboot 配置,加载的过程需要通过所有的Framework 初始化,因为4 ~' _7 X4 R6 D8 X' e# E
Framework 不知道以下信息- z7 Y. T: }, d! ]
* PEIMs 提供的Preboot 配置& r \. m1 T% t3 f: e6 x+ n
不同厂商提供的驱动最后Framework 还是需要像正常启动一下执行一次,执行流程
* }1 ]' u2 |8 e' G [3 k: `3 \/ h如下:0 g8 C) {3 g$ h7 `2 e+ `+ c; g J
6 Q$ g5 d' |- f$ X
3 u9 O' \! a% N9 P6 Q5 j' G, T- V7 P* a* q6 ]2 {. R4 b1 A
四:S3 恢复阶段的执行流程:' G/ F; n8 K/ @* X7 u3 E+ d
SEC 是第一个被Framework 执行的,因此SEC 保存了S3 返回时的启动路径 F3 P5 _+ u: L" W
1:PEI 和S3 返回的路径:& U6 y. `2 @! w
S3 返回时Framework 将加载PEI 的端口配置。PEIM 可能调用相应的PEI 服务找出正
' g3 Q2 }, M, D' h确的启动路径。PEIM 会保存配置正常的启动过程,并且利用来配置S3 的返回路5 \+ H! @7 w$ b1 U8 ~: E
径。
& g' x% E, f7 @3 S* d- s k3 B: p
8 T. m6 _' N5 B9 x
2:在PEI 过程中保存配置数据
+ O0 x R1 w% y2 m. T有很多种方法来保存配置数据,如firmware volume 变量,nonvolatile storage (NVS)
$ a& {8 W9 v$ P3 g4 I2 }3: DXE 和S3 返回启动路径! c( a+ V4 k8 [0 p2 E
在DXE 阶段,有多种DXE 可以使平台到Preboot 阶段。让DXE 进入S3 返回启动路径5 R! Q: V/ q* s2 [- \* I) q
使DXE 驱动存在一定风险,原因如下: * DXE 启动有很多服务,这使它变的很庞大7 \8 ]& d8 C* |, k& ~
* 加载DXE 从flash 空间需要一定的时间。
如果DXE 在启动过程中能在NVS 中保存,那么DXE 需要的大量内存和复杂的# l/ j4 ~. `* l( `9 | y
DXE 启动过程就不需要执行。
2 g9 m) W" I g0 AFramework 提供一个boot script 让S3 返回时获得DXE 的所有信息。这些信息是在
# r9 G7 ?* E" @+ U% v; l) NDXE 驱动正常启动过程中保存在平台的NVS 中形成的。在S3 启动过程中到NVS 中查0 s# E/ b/ [- t( y7 X' ^: J+ M( ^
找boot script,
. X( r# E& x' j! s1 I找到后加载这些配置。 * ACPI 要求BIOS 加载chipset 和CPU 的配置信息
/ x' `, ?- f: A- r* Chipset 的配置包括:memory,I/O 和PCI 的配置。这些信息是在DXE 启动过程7 q# [/ ~4 s! Z: ~* p2 @
中保存下来的。; c ?' J! u, K! t0 J! q5 ~* d
* CPU 的配置包括:SMM,Microcode updates, Processor-specific initialization,
) q' i E# G9 S N* D+ i. ZProcessor chache setting.
4: Framework Boot Script:
1 ~; Y6 a+ }4 f9 U5 pFramework boot script 是一个script 用来描述一些常用的初始化平台操作。如I/O,! e; x" J f6 }/ }
memory, PCI 和SMBus。4 R. s- T4 |/ G6 W( d' w" q
可能有多个boot script tables 在某些平台,这些table 描述了如何成功让平台进入
" V% K% [% w t) [1 ?( W4 V% I4 iPreboot 状态。4 I5 s. l5 z e4 w) }9 q
5:S3 返回PPI 和DXE IPL PPI
0 R) l+ |( v! o" D+ _DXE IPL PPI 是最后一个被执行的PPI 在PEI 阶段,将提供正确的启动路径给
: k0 ^& ]& N# y" v+ uFramework。因此,DXE IPL PPI 将初始化CPU 和Preboot 平台,最后跳到OS 的: V5 p! { s& f5 }+ b
呼醒向量处。在正常启动时DXE 是不会执行他的。
1 q# p# ]' [) |5 ^5 W7 T' i在S3 返回时,DXE IPL PPI 将会定位S3 Resume PPI.如果被找到,DXE IPL PPI 将会把
! B0 M" N& }: m* l4 y% j- W控制权交给S3 Resume PPI. S3 Resume PPI 将会执行一此配置让平台进入Preboot! @9 @) E8 a. o; x
state.
6 |/ A; J3 y: c3 PS3 Resume PPI 必须执行Framework boot Script table 来加载平台配置。它负责找到OS( V/ q; v2 F r/ z
waking vector 并且将控制权交给OS 来完成S3 返回。. N- g0 |, ?8 t# p
在整个过程中,只有内存是S3 启动可以使用的。任何内存使用会扰乱系统的context(国9 z* d" m5 C7 _
入喜欢叫他为 上下文 ),使S3 失败。% s# K! X4 M" s
S3 Resume PPI 需要知道如下情况:
" n3 s8 l0 J( t" ^: k' ?* 内存S3 boot Script Table 的地址或者firmware volume file 中S3 boot script table
5 o/ ?. {1 i0 n$ t. q/ @' U的地址。
% ?$ X& g5 Z' j$ E8 h* RSDT 指针中ACPI 开始的地址和OS 的waking vector" S* g7 h' j$ F3 u2 a& y
* 保留一段内存给S3 返回时使用。 " ^$ G, t9 U$ Y( l9 g" [
|
|