|
|
一:平台初始化的多个阶段:
$ N3 K. q3 s p- r(1) Pre-EFI Initialization (PEI)
# w2 [9 Z5 J+ l$ F. G/ \& h& g yPEI 负责尽可能的初始化平台为执行DXE 做准备,
2 A6 f/ _% N/ \; V% g(2) Driver Execution Environment (DXE)
( \, g: E! Z' Y3 G在DXE 阶段可能会改变PEI 初始化的环境,有些参数会被DXE 重写。
& O& t9 y0 ]2 Q( Q2 ^, ]* w1 w
: x2 n2 u' i% Y1 _! K$ y+ P$ T/ _二:平台初始化的流程:+ ^3 V$ y! y/ ]1 m, A
(1) I/O 操作
) P3 R# D: w' @$ i/ @; K4 Z' S(2) 内存操作- {- U2 Z- f9 t5 `" u3 h0 a& t
(3) 配置PCI 配置空间2 ~: R) Q2 z5 d5 Z( d5 L# I
(4) 通过PPIs 收集平台的动作。
0 [: \0 b# t/ N# f# k* y l
. B& E& H6 L% m# {三:恢复平台状态: E1 b) {8 I* _. E& G) y
S3 返回是加载平台的Preboot 配置,加载的过程需要通过所有的Framework 初始化,因为, T; v* b1 J2 d1 ?
Framework 不知道以下信息: e; g; |# P" m( ~4 a. K! {
* PEIMs 提供的Preboot 配置/ B* ~/ I; X8 ?8 x- |" G6 u
不同厂商提供的驱动最后Framework 还是需要像正常启动一下执行一次,执行流程5 p% z1 y2 l! J
如下:
" p3 g0 j/ e( Y* t
- n: Y5 V6 n" M7 S0 T0 d* c9 f
3 U) w& T: Y, q& G( |' d+ ]8 h* T/ L# n6 ~: a
四:S3 恢复阶段的执行流程:9 b! t3 ~9 Y3 A, f) \
SEC 是第一个被Framework 执行的,因此SEC 保存了S3 返回时的启动路径
' _- J/ n* a% @1:PEI 和S3 返回的路径:( O" s5 ^& W+ G
S3 返回时Framework 将加载PEI 的端口配置。PEIM 可能调用相应的PEI 服务找出正 K6 a& ^9 Z% D" x" A9 ~. [! [
确的启动路径。PEIM 会保存配置正常的启动过程,并且利用来配置S3 的返回路: u _6 R9 o9 H! o
径。
3 m7 Q3 y8 o. o j
5 e4 f# ]. i8 F! O7 }" }
2:在PEI 过程中保存配置数据0 ^* G) ~( s1 A: c: z- B i
有很多种方法来保存配置数据,如firmware volume 变量,nonvolatile storage (NVS)
3 r; Y" \1 K/ L" s3: DXE 和S3 返回启动路径
# H2 e* F# J: S- [, {9 a$ y在DXE 阶段,有多种DXE 可以使平台到Preboot 阶段。让DXE 进入S3 返回启动路径1 f6 K2 u3 \& Z( A- M [
使DXE 驱动存在一定风险,原因如下: * DXE 启动有很多服务,这使它变的很庞大
( {; _" \; W3 C$ J1 w* 加载DXE 从flash 空间需要一定的时间。
如果DXE 在启动过程中能在NVS 中保存,那么DXE 需要的大量内存和复杂的
h- j# l! ^; C- R* g2 xDXE 启动过程就不需要执行。' _2 ~& N) g! I
Framework 提供一个boot script 让S3 返回时获得DXE 的所有信息。这些信息是在6 P2 @ c, p4 U9 T/ j
DXE 驱动正常启动过程中保存在平台的NVS 中形成的。在S3 启动过程中到NVS 中查
) [5 P; G7 Z; x& P+ j6 F找boot script,
% w1 M& L3 _" f6 b( y找到后加载这些配置。 * ACPI 要求BIOS 加载chipset 和CPU 的配置信息: G& ^5 s. w$ z; w6 g
* Chipset 的配置包括:memory,I/O 和PCI 的配置。这些信息是在DXE 启动过程
7 n3 @# a S2 \0 x中保存下来的。
1 @! I. G' T. @ K0 z* CPU 的配置包括:SMM,Microcode updates, Processor-specific initialization,
8 \( R0 j' Y$ tProcessor chache setting.
4: Framework Boot Script:8 y: e/ b4 i8 ^( [
Framework boot script 是一个script 用来描述一些常用的初始化平台操作。如I/O,
* ^! m% K! q5 ^$ Jmemory, PCI 和SMBus。- ^6 t" A8 z- B, B: u
可能有多个boot script tables 在某些平台,这些table 描述了如何成功让平台进入& w4 s* d. [' i2 H3 x
Preboot 状态。
- j% M# D* } X7 g# v5:S3 返回PPI 和DXE IPL PPI
& _5 m! y# g0 @) X1 L. iDXE IPL PPI 是最后一个被执行的PPI 在PEI 阶段,将提供正确的启动路径给
& [9 B5 e9 i3 NFramework。因此,DXE IPL PPI 将初始化CPU 和Preboot 平台,最后跳到OS 的
# R6 Q+ K' `( R9 w( Z9 u5 h$ C呼醒向量处。在正常启动时DXE 是不会执行他的。
% e, D( p$ X. n2 u在S3 返回时,DXE IPL PPI 将会定位S3 Resume PPI.如果被找到,DXE IPL PPI 将会把% \+ U6 {0 ?, m/ x& k* ~
控制权交给S3 Resume PPI. S3 Resume PPI 将会执行一此配置让平台进入Preboot* d: O7 C5 c$ d. C6 w8 q% d, D8 W
state.
; n6 p$ o+ S7 H0 V- H0 SS3 Resume PPI 必须执行Framework boot Script table 来加载平台配置。它负责找到OS, ]) r% a2 {. B/ Y2 }
waking vector 并且将控制权交给OS 来完成S3 返回。/ H. f( X$ \: O% H. u
在整个过程中,只有内存是S3 启动可以使用的。任何内存使用会扰乱系统的context(国$ c9 o) S# K$ U7 X9 p/ I+ W2 Q
入喜欢叫他为 上下文 ),使S3 失败。; j. I, u! P% m
S3 Resume PPI 需要知道如下情况:
# F d( W5 p6 o; |2 G" H* 内存S3 boot Script Table 的地址或者firmware volume file 中S3 boot script table1 @' b" \% Q7 N0 ^( b& [: ~/ F
的地址。
! Y1 i0 k/ D, [4 F) _* RSDT 指针中ACPI 开始的地址和OS 的waking vector! k5 j5 x9 \* C; u
* 保留一段内存给S3 返回时使用。
9 i2 F0 |% T/ Y/ S' r
|
|