|
|
一:平台初始化的多个阶段:
& R9 u. Q* Y% N! H4 h(1) Pre-EFI Initialization (PEI)
( i9 @8 U: ^# \- J6 N' {5 NPEI 负责尽可能的初始化平台为执行DXE 做准备,
0 A8 ~- c2 F! B(2) Driver Execution Environment (DXE) H* u, z* v9 O4 {8 B5 G
在DXE 阶段可能会改变PEI 初始化的环境,有些参数会被DXE 重写。
/ Y( Z7 r, u% p4 l% ?, y f2 Z# v
! V& M( R9 [2 {6 I二:平台初始化的流程:" {% d, l: n8 x
(1) I/O 操作
% T' _/ X( c2 z& H) ~) C" O(2) 内存操作
: `) |1 s I7 X0 X1 @2 x(3) 配置PCI 配置空间
' D8 T( O- b A+ R" u4 J4 ~! H(4) 通过PPIs 收集平台的动作。
6 ]* A) `' C* }- W" _& S* `, ^; H" j5 u N. |. w4 Q& R
三:恢复平台状态:0 ~8 g! B; r3 y0 P
S3 返回是加载平台的Preboot 配置,加载的过程需要通过所有的Framework 初始化,因为
2 Y0 `7 P, ?7 A) A. L: GFramework 不知道以下信息- s0 w: B4 V9 N K( [ q# F
* PEIMs 提供的Preboot 配置
) \% P/ E; ]9 _* Q" a# ^0 `* ]. z 不同厂商提供的驱动最后Framework 还是需要像正常启动一下执行一次,执行流程7 Y. c" d/ g( M/ n% }2 |
如下:2 Y4 W9 ]8 t# N- @0 x2 O* }
/ d" [# @6 ?+ j2 ~ ?
$ M5 O8 ?3 A0 V7 y* b
& y) E: p( T$ s) e( \
四:S3 恢复阶段的执行流程:- o, H: w1 ?3 @
SEC 是第一个被Framework 执行的,因此SEC 保存了S3 返回时的启动路径( p" }7 ? |/ _2 ?" {( w
1:PEI 和S3 返回的路径:
0 B. I! ?1 H% \: VS3 返回时Framework 将加载PEI 的端口配置。PEIM 可能调用相应的PEI 服务找出正, W+ N9 A' c: _! K* q, f
确的启动路径。PEIM 会保存配置正常的启动过程,并且利用来配置S3 的返回路( c* R0 P0 w# M
径。5 g4 ~) U0 K( F9 K0 [! D2 l& X
; x2 e0 p4 f n4 b0 X# s; d- l2:在PEI 过程中保存配置数据
- M0 z6 d" q7 E7 H有很多种方法来保存配置数据,如firmware volume 变量,nonvolatile storage (NVS)
9 A0 [& ~& i, T1 ^0 P1 T3: DXE 和S3 返回启动路径6 X, Z q8 U- G+ T
在DXE 阶段,有多种DXE 可以使平台到Preboot 阶段。让DXE 进入S3 返回启动路径
$ W: @3 |1 P k I2 E使DXE 驱动存在一定风险,原因如下: * DXE 启动有很多服务,这使它变的很庞大
1 v5 I4 c, `: h( _4 Q R7 K* 加载DXE 从flash 空间需要一定的时间。
如果DXE 在启动过程中能在NVS 中保存,那么DXE 需要的大量内存和复杂的' v$ y S& t$ H8 f
DXE 启动过程就不需要执行。2 q9 Z' Y$ Z# d# ^" M2 K. g
Framework 提供一个boot script 让S3 返回时获得DXE 的所有信息。这些信息是在 _# O4 j( E; ~; Q1 J, r
DXE 驱动正常启动过程中保存在平台的NVS 中形成的。在S3 启动过程中到NVS 中查
* ^, K2 R6 H4 m找boot script,7 h2 X% y y6 m. i
找到后加载这些配置。 * ACPI 要求BIOS 加载chipset 和CPU 的配置信息
% Q5 R `* `+ Z+ w" O' [8 O! ?* Chipset 的配置包括:memory,I/O 和PCI 的配置。这些信息是在DXE 启动过程
. u8 U( P* T' ]7 l4 Y! U2 {2 E! m中保存下来的。
& }9 D m' `( [9 N* CPU 的配置包括:SMM,Microcode updates, Processor-specific initialization,
* O$ O* I8 ^3 e( cProcessor chache setting.
4: Framework Boot Script:
1 |9 g( g! N9 M4 _$ Q: D/ M! I9 mFramework boot script 是一个script 用来描述一些常用的初始化平台操作。如I/O,
: K( Z: x1 y+ E2 l; B0 a9 bmemory, PCI 和SMBus。/ i- `3 F' }$ ]7 @0 F+ e' g
可能有多个boot script tables 在某些平台,这些table 描述了如何成功让平台进入4 @1 r& W0 @. j7 S9 @7 J( e
Preboot 状态。
* m6 J: R" t8 F) }# }; }1 u5:S3 返回PPI 和DXE IPL PPI
6 ^ e* `9 f/ C9 g; NDXE IPL PPI 是最后一个被执行的PPI 在PEI 阶段,将提供正确的启动路径给
! f# j, _ F; {Framework。因此,DXE IPL PPI 将初始化CPU 和Preboot 平台,最后跳到OS 的/ F6 M3 Y9 w N7 A; {# B
呼醒向量处。在正常启动时DXE 是不会执行他的。
! Q5 w: |8 b1 s3 N& w" A" Z在S3 返回时,DXE IPL PPI 将会定位S3 Resume PPI.如果被找到,DXE IPL PPI 将会把
5 M; U2 y8 a' I+ N: `$ D控制权交给S3 Resume PPI. S3 Resume PPI 将会执行一此配置让平台进入Preboot! @" `8 J6 T0 c0 x; a; H
state.
& e0 n. {0 Y& o/ _ s% J0 YS3 Resume PPI 必须执行Framework boot Script table 来加载平台配置。它负责找到OS( e& Z7 P7 }- Z) V i
waking vector 并且将控制权交给OS 来完成S3 返回。& d& t+ I. b t, n
在整个过程中,只有内存是S3 启动可以使用的。任何内存使用会扰乱系统的context(国- s; ?- O) C$ W( `
入喜欢叫他为 上下文 ),使S3 失败。+ @4 i; C8 g' ?2 y p. v% R6 Q$ }
S3 Resume PPI 需要知道如下情况:
' \+ u; q9 A! ~& `. B* 内存S3 boot Script Table 的地址或者firmware volume file 中S3 boot script table
$ J! Z) F; e P8 n: ~2 m0 J的地址。7 ?2 \- W3 g8 l# S
* RSDT 指针中ACPI 开始的地址和OS 的waking vector6 o; l3 m1 Z' O8 \9 ~, n& M. i/ m! _
* 保留一段内存给S3 返回时使用。
, f) d+ V+ [- O7 j. n# W
|
|