没有合适的资源?快使用搜索试试~ 我知道了~
首页UEFI BIOS技术文档
资源详情
资源评论
资源推荐

UEFI 正常启动过程--与 EDK 为例,大家一起讨论吧!
最近在工作看到机台有启动过程中把 SPIROM 数据清空,但苦与没有办法很好的 Debug(PCA 没有架起来),
所有与 EDK 为对象好好的读了一把。$ \: @Y' k9 D+ XM. ~
SEC/CEI:
UEFIBIOS 启动时先会执行 SEC/CEI,这个阶段在实现的 BIOS Code 中初始化 DebugPort,进入 Big Mode,CPU
的 MicroCode,CacheToRAM 的转换.然后跳转到 PEI 阶段。5 B( w: l, tZ) y) {+ Q* H) T
在 EDK 中这部分被成了 Load FvRecovery.fd 文件,这个文件类似与我们的 BIOS ROM.里面是我们编译后生成的二进
制代码。在这个阶段最主要的是将这个文件加载到内存中(Windows API 将文件加载到内存,看 API 函数).5 @& B+ m# M% y! s/ A) @$ K
7 r! I" g2 I1 O3 o" P/ |% K/ X% r+ A
PEI:2 o! S( D3 Q0 Q3 x! D
从这里开始 UEFIBIOS 和 EDK 执行基本相同,只是一个是从 SPI ROM 中定位一个地址(PEIM 的开始地址),一个
是从内存中定位一个地址(PEIM 的开始地址)。从这里开始只讲 EDK 的执行 0 o( }) WM! G! l# a- M" N0 J0 i/ H: e4 w
EDK 调用 InitializeMemoryService 函数,将 HobList 清空,peiservice 清空。# N) L# c; j' _0 g) P
InitializePPIService 函数,将 PPI 队列清空,这个队列长 0x3F." I9 R5 U/ ?; ~. X5 }) Z
InitializeSercurityService 函数,将 Notify 队列清空。
InitializeDispatcherData 函数,将 Dispatcher 队列清空。
接着由 PeiBuildHobGuid 来建立一个 HOB(S3 返回时这时应该有这个 HOB,不用建立,直接使用了,这样就会
进入另外一个流程,可以这个 EDK 不能调试 S3,不知道怎么走)。然后由(*PeiServices)->InstallPpi()将这个新 HOB
加入到 PPI 中。
由于在 SEC 阶段转了以下这几具 PPI,所以在执行 PEI 的 Dispatcher 之前会先安装东西:8 ~/ P8 K1 b4 J% R3 R) B
EFI_PEI_PPI_DESCRIPTOR gPrivateDispatchTable[] = {0 l9 `& z/ g. R2 M. j
{EFI_PEI_PPI_DESCRIPTOR_PPI, &gEfiNtLoadAsDllPpiGuid, &mSecNtLoadAsDllPpi},5 E1 p: n* D- W
{EFI_PEI_PPI_DESCRIPTOR_PPI, &gNtPeiLoadFileGuid, &mSecNtLoadFilePpi},
{EFI_PEI_PPI_DESCRIPTOR_PPI, &gPeiNtAutoScanPpiGuid, &mSecNtAutoScanPpi},
{EFI_PEI_PPI_DESCRIPTOR_PPI, &gPeiNtThunkPpiGuid, &mSecWinNtThunkPpi},3 z; s5 P1 U/ R+ C+ x
{EFI_PEI_PPI_DESCRIPTOR_PPI, &gPeiStatusCodePpiGuid, &mSecStatusCodePpi},& Z! i# T5 p! w% w+ w; y
{EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
&gNtFwhPpiGuid, &mSecFwhInformationPpi}
};
每个 PPI 是由{类型,GUID(名字,以后就根据这个来找到它的),Function_Entry_Address}组成。
这些 PPI 会在 PEIDispatcher 中用到。
安装完这此东西这开始执行 PEIDispatcher 函数,函数从 BIOS ROM 文件中找出 PEI 的 Image(怎么找到,请
读一下 FV_HEAD(EFI_HEAD),里面讲到了如何区分 Image 类型),然后定位到 PEI Image 的入口地址,执行他。
在我们的的 PEI 中,我们一般会申明一个 PPI,这个就是这个 PEI 提供一些服务,PEIDispatcher 会将他们加入到 PPI
-List 中,以后其他 Image 也可以调用他的提供的功能。3 I$ R! `4 W- Q" j, B" a2 n4 z3 f
最后 EDK 会加载一个叫 DXEIPL 的 PEI,DXEIPL 提供一个 PPI 服务,这个 PPI 的功能是实现从 PEI 到 DXE 的
切换,这个 PPI 里面为 DXE 做了很多的预准备,加载了很多 PPI,如对 BIOS 的解压方法等。! |4 s& U: ~; h% wx
SwitchStacks () Q$ m( [+ v9 R1 c
(VOID *) (UINTN) DxeCoreEntryPoint,
(UINTN) (HobList.Raw),
(VOID *) (UINTN) TopOfStack,6 V6 @) O! a& t
















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0