|
|
一:平台初始化的多个阶段:, b& T1 l u0 P+ O9 D) o1 q, x
(1) Pre-EFI Initialization (PEI)
; l$ V* s4 x7 w& u# _/ mPEI 负责尽可能的初始化平台为执行DXE 做准备,
" W' a1 S+ i- }. P% t3 J(2) Driver Execution Environment (DXE)
( G/ [; B# l' d- A' e. e在DXE 阶段可能会改变PEI 初始化的环境,有些参数会被DXE 重写。 0 q' p6 Z: Z w9 I# O
" p0 e0 {" C7 v/ y二:平台初始化的流程:
" U" f# O8 V0 s( w# \0 Q! `! N(1) I/O 操作! Y" g: ]$ m: H* q y
(2) 内存操作
% A( n6 s) B2 C5 N(3) 配置PCI 配置空间: I9 G, l# S" H4 g0 U: \
(4) 通过PPIs 收集平台的动作。
}. l' J% b, D# J- e5 b8 \ C* m/ R. b
三:恢复平台状态:3 G x/ G. i) f4 b
S3 返回是加载平台的Preboot 配置,加载的过程需要通过所有的Framework 初始化,因为
/ }: [+ @2 o# U* h% o# XFramework 不知道以下信息& m S3 A% l. M/ ?8 A$ e
* PEIMs 提供的Preboot 配置2 a, y% l8 B; l- W' H
不同厂商提供的驱动最后Framework 还是需要像正常启动一下执行一次,执行流程
- _ E1 L7 l0 R. _$ J9 N3 ?4 e, R如下:4 M# E8 |( V' l( d1 a6 r. q7 `/ S; D
7 O6 I" u, }# ]
/ D X# a' {- f0 a5 W
/ y0 A+ a3 c7 x( s2 v/ J1 K5 N四:S3 恢复阶段的执行流程:
* U7 Q, M# V L, MSEC 是第一个被Framework 执行的,因此SEC 保存了S3 返回时的启动路径
) @( F2 d: Y, `/ a& A7 w, B1:PEI 和S3 返回的路径:
+ h! c7 R/ c: f# l @, T/ J$ E/ JS3 返回时Framework 将加载PEI 的端口配置。PEIM 可能调用相应的PEI 服务找出正# ^4 `) w) S$ j% L' H; |) @
确的启动路径。PEIM 会保存配置正常的启动过程,并且利用来配置S3 的返回路# Y5 N; q& ]$ |+ r
径。$ _0 n8 V+ r+ o. }; e( l& w
( k) H3 W9 } Q! p( m$ o0 f+ y N
2:在PEI 过程中保存配置数据" Z7 s% }+ {8 ~
有很多种方法来保存配置数据,如firmware volume 变量,nonvolatile storage (NVS)
% F+ X# B* C% {3: DXE 和S3 返回启动路径! W1 Y* h2 U8 L, A, K% G
在DXE 阶段,有多种DXE 可以使平台到Preboot 阶段。让DXE 进入S3 返回启动路径
' z* [( b) I. {3 W: z- f使DXE 驱动存在一定风险,原因如下: * DXE 启动有很多服务,这使它变的很庞大
5 x' l, Y6 h% q4 y6 F& b4 c7 l# j* 加载DXE 从flash 空间需要一定的时间。
如果DXE 在启动过程中能在NVS 中保存,那么DXE 需要的大量内存和复杂的" x) E' q+ ~0 F- |$ V8 a
DXE 启动过程就不需要执行。
9 z3 n% Y6 W; U2 CFramework 提供一个boot script 让S3 返回时获得DXE 的所有信息。这些信息是在
7 ~6 k, m2 D. I0 s+ p6 ODXE 驱动正常启动过程中保存在平台的NVS 中形成的。在S3 启动过程中到NVS 中查
7 B. G9 a9 B+ t找boot script,. U% Q) |( I; Z
找到后加载这些配置。 * ACPI 要求BIOS 加载chipset 和CPU 的配置信息
' o# M; I5 y R2 p0 q* i: I* Chipset 的配置包括:memory,I/O 和PCI 的配置。这些信息是在DXE 启动过程9 L* p, e2 G( j, i' m" v) i
中保存下来的。
2 a# F y, x; \% S6 `; T* CPU 的配置包括:SMM,Microcode updates, Processor-specific initialization,( g" w) u' b5 B$ v i/ ?
Processor chache setting.
4: Framework Boot Script:: S/ k! c5 O1 \* _& g+ _7 Z
Framework boot script 是一个script 用来描述一些常用的初始化平台操作。如I/O,
& v2 d9 W9 F; E: a* P) vmemory, PCI 和SMBus。
4 V$ w0 L7 p1 O( ^2 ^0 ]( j可能有多个boot script tables 在某些平台,这些table 描述了如何成功让平台进入
* S( Q4 R0 P% x, p- _5 V, E( oPreboot 状态。' D: j/ k3 b. Z6 e) e
5:S3 返回PPI 和DXE IPL PPI' q+ Y& K. p4 X$ T
DXE IPL PPI 是最后一个被执行的PPI 在PEI 阶段,将提供正确的启动路径给
g5 q( o, K4 j9 c/ n) h. }Framework。因此,DXE IPL PPI 将初始化CPU 和Preboot 平台,最后跳到OS 的
* O" _6 T/ W3 o0 M- A' b呼醒向量处。在正常启动时DXE 是不会执行他的。6 W0 |8 G4 x: o( e9 A
在S3 返回时,DXE IPL PPI 将会定位S3 Resume PPI.如果被找到,DXE IPL PPI 将会把
' H0 Q, C$ l7 j控制权交给S3 Resume PPI. S3 Resume PPI 将会执行一此配置让平台进入Preboot9 q( _ f0 F3 D, U! W' M; J
state.
8 ]6 q, j' n0 aS3 Resume PPI 必须执行Framework boot Script table 来加载平台配置。它负责找到OS
8 P% ^6 M, j- d2 nwaking vector 并且将控制权交给OS 来完成S3 返回。
9 H4 C' Y1 s- l* ?& `" ]# U, z在整个过程中,只有内存是S3 启动可以使用的。任何内存使用会扰乱系统的context(国
0 e2 t+ B6 q' M入喜欢叫他为 上下文 ),使S3 失败。
2 j! d' i! D& T' eS3 Resume PPI 需要知道如下情况:
+ w1 ]" T D7 L0 x& a* 内存S3 boot Script Table 的地址或者firmware volume file 中S3 boot script table7 t( S" K4 B* ]
的地址。
6 b4 S7 ?0 Q) o4 ^* RSDT 指针中ACPI 开始的地址和OS 的waking vector$ X" Y! U. ]; M+ e
* 保留一段内存给S3 返回时使用。
2 Z$ n: B0 G" }0 Z
|
|