|
|
一:平台初始化的多个阶段:
2 ^5 u9 D0 o/ o( N3 Q(1) Pre-EFI Initialization (PEI)
' h, G9 |$ B5 Q! {3 T+ vPEI 负责尽可能的初始化平台为执行DXE 做准备,
/ Y! W. T- }" R' J. ](2) Driver Execution Environment (DXE)" F/ p; I' T$ P( i+ J+ E9 b
在DXE 阶段可能会改变PEI 初始化的环境,有些参数会被DXE 重写。 . w3 z3 A" F/ P; O
. g9 L! Y+ A+ ~" ~ t4 I$ Y
二:平台初始化的流程:2 Q. b0 l) M, O# E8 J
(1) I/O 操作2 b& y2 c* D f% ?0 y e; M
(2) 内存操作
1 W2 A, u7 X, ~(3) 配置PCI 配置空间
! P* C4 k0 `; P' L+ I/ T(4) 通过PPIs 收集平台的动作。
6 B4 \4 n& E s- u9 _: I7 d
' `4 b8 L! j8 k k [三:恢复平台状态:; c& V( a7 R. n6 w$ A5 C z/ e9 S0 q
S3 返回是加载平台的Preboot 配置,加载的过程需要通过所有的Framework 初始化,因为, \) |4 @1 A {9 `1 `1 O0 V8 s# r
Framework 不知道以下信息: \) D, L, A2 W; `
* PEIMs 提供的Preboot 配置! V+ C( `! E3 s7 X' l5 b I4 a1 W2 }0 Z
不同厂商提供的驱动最后Framework 还是需要像正常启动一下执行一次,执行流程
9 l2 n7 v/ L. b7 J- T! G如下:; z6 P0 k. D. r# K2 \
( H* }( F7 n# R+ x5 o u" C5 p3 f# r, Z1 W
0 I6 b" n% r5 Z& y) u四:S3 恢复阶段的执行流程:
7 W3 y, y0 H, VSEC 是第一个被Framework 执行的,因此SEC 保存了S3 返回时的启动路径
# D4 m3 E, w( e f, s1:PEI 和S3 返回的路径:% C, ~+ b1 ]7 ?; D) [$ k3 h
S3 返回时Framework 将加载PEI 的端口配置。PEIM 可能调用相应的PEI 服务找出正
0 V# Z5 k4 h4 v' ^. w* \确的启动路径。PEIM 会保存配置正常的启动过程,并且利用来配置S3 的返回路
$ L4 T9 A$ A( A, }# q径。( C- i' B% ?" O, V- ~5 b5 i
! g. w- V, n3 [0 M8 y2 U: j
2:在PEI 过程中保存配置数据9 E8 z5 m7 b/ ~/ x9 L/ B8 x
有很多种方法来保存配置数据,如firmware volume 变量,nonvolatile storage (NVS)
( `% {2 p1 u$ w$ O! v7 M3: DXE 和S3 返回启动路径! `8 b0 P& P7 g6 [' i( ^
在DXE 阶段,有多种DXE 可以使平台到Preboot 阶段。让DXE 进入S3 返回启动路径" Y4 z# p- u) j* R
使DXE 驱动存在一定风险,原因如下: * DXE 启动有很多服务,这使它变的很庞大
, F) ~$ b0 `1 \& p' x/ e# i* 加载DXE 从flash 空间需要一定的时间。
如果DXE 在启动过程中能在NVS 中保存,那么DXE 需要的大量内存和复杂的
/ v C' a/ I$ B; u3 O2 ~# G, lDXE 启动过程就不需要执行。
; ]+ ~, L0 b7 g/ T" |- vFramework 提供一个boot script 让S3 返回时获得DXE 的所有信息。这些信息是在
, c3 g, ~/ b- \8 c* V0 j* }DXE 驱动正常启动过程中保存在平台的NVS 中形成的。在S3 启动过程中到NVS 中查
! [3 j2 k- @9 |1 w6 W7 ]找boot script,
8 v/ j( A- k1 M6 Z/ ~找到后加载这些配置。 * ACPI 要求BIOS 加载chipset 和CPU 的配置信息
, u+ p8 d, a, s" {/ ^* Chipset 的配置包括:memory,I/O 和PCI 的配置。这些信息是在DXE 启动过程, {$ e, s) S3 Q- ?0 ^6 r- Y; ]7 g
中保存下来的。9 n" T" r; D1 }3 @; \; f
* CPU 的配置包括:SMM,Microcode updates, Processor-specific initialization,
5 _: [, v, k1 z/ E5 C. J1 e7 LProcessor chache setting.
4: Framework Boot Script:7 ?2 q1 U2 x6 b
Framework boot script 是一个script 用来描述一些常用的初始化平台操作。如I/O,+ }# a( b# M; |. O6 k. f; r, z0 l
memory, PCI 和SMBus。
& W9 b% r7 Y. K7 M$ \0 N8 f! _可能有多个boot script tables 在某些平台,这些table 描述了如何成功让平台进入
$ o# t* U7 j. k' YPreboot 状态。
7 M: Q, u$ p/ n- Y' v; Q5:S3 返回PPI 和DXE IPL PPI
9 F- Y9 A6 m0 U1 ]DXE IPL PPI 是最后一个被执行的PPI 在PEI 阶段,将提供正确的启动路径给8 l- C+ W; l( z5 |% x% a' L
Framework。因此,DXE IPL PPI 将初始化CPU 和Preboot 平台,最后跳到OS 的8 e% F j: R- g) a/ t {$ y
呼醒向量处。在正常启动时DXE 是不会执行他的。 i4 D3 r/ J. N7 g& ?
在S3 返回时,DXE IPL PPI 将会定位S3 Resume PPI.如果被找到,DXE IPL PPI 将会把
7 w/ [1 ~1 ^7 @; o# G6 h6 g3 h* P控制权交给S3 Resume PPI. S3 Resume PPI 将会执行一此配置让平台进入Preboot
7 M. c# A7 @6 ^& {( n$ R4 e- Astate.7 L6 m' \9 o: f! ]9 r8 k% D
S3 Resume PPI 必须执行Framework boot Script table 来加载平台配置。它负责找到OS4 ^6 s7 v0 {8 B. @* V: n
waking vector 并且将控制权交给OS 来完成S3 返回。
* m' A5 C' {5 c1 U0 s! {+ P/ l3 q在整个过程中,只有内存是S3 启动可以使用的。任何内存使用会扰乱系统的context(国
& h/ k+ r) A) Y2 H( S6 ^) J; u入喜欢叫他为 上下文 ),使S3 失败。7 n: p3 p% K( R: h! o" X
S3 Resume PPI 需要知道如下情况:8 Z0 c6 i2 r! h- {5 D0 g
* 内存S3 boot Script Table 的地址或者firmware volume file 中S3 boot script table
8 m( J0 k+ k* n% k" t的地址。
Q* u* @( z" l8 x* N" e$ n* RSDT 指针中ACPI 开始的地址和OS 的waking vector E! v2 u4 x# c0 r7 N
* 保留一段内存给S3 返回时使用。
, e w$ t7 S9 D8 i! Y" I' @
|
|