UEFI Boot Flow 系列之SEC
2012-09-15 09:04
1121 查看
转自CeliaQianhj
为什么要有SEC Phase?
1. 需要用汇编语言来完成C无法处理的工作,如C语言无法处理CPU的特殊寄存器(MSR,MTRR,CRX)。
2. C语言需要Memory当成Stack来处理Local 变数,而刚开机Memory还没有被初始化,还不可用,所以需要CAR(Cache As Ram)的初始化。
3. 让CPU进入Protected Mode(Flat Mode)。
SEC Phase的任务
SEC Phase是整个UEFI Boot过程中的第一个阶段,它主要完成的任务有:
1. 系统上电/重启的入口,处理所有的平台restart events,包括开机,重启,或是各种异常条件下的启动。
2. 创建一块临时的内存区域,在系统内存初始化之前使用,比如用CAR(Cache As Ram)或SRAM。
3. 在安全方面,是信任链的根(the root of trust)。之后模块的任何安全相关的设计都必须有个根,而因为系统开机之后最初的代码实现是在SEC阶段,所以平台设计者在调用PEI Foundation之前可以在SEC阶段验证PEI Foundation的安全性。所以说SEC阶段是系统信任链的根。
4. 传送Handoff信息到PEI Foundation(这才是SEC Phase的最终目的),这些信息包括:
1>.平台的状态,
2>.BFV(Boot Firmware Volume)的位置和大小,
3>.临时RAM的位置和大小,
4>. 栈的位置和大小。
数据结构为:EFI_PEI_STARTUP_DESCRIPTOR。
typedef struct {
UINTN BootFirmwareVolume;
UINTN SizeOfCacheAsRam;
EFI_PEI_PPI_DESCRIPTOR *DispatchTable;
} EFI_PEI_STARTUP_DESCRIPTOR;
另外,还有一个PPI:EFI_SEC_PLATFORM_INFORMATION_PPI 可以用来传送Handoff信息。在SEC_PLATFORM_INFORMATION_PPI.PlatformInformation()中定义了一个EFI_HEALTH_FLAGS,它包含了Processor,hardware,and/or安腾处理器中PLA(Processor Abstract Layer)代码中关于处理器Reset上的状态信息。
SEC阶段代码流程图:
PEI Core Entry Point 是如何确定的?
是由Build Tool来确定的。在Build出来的bin file位置0xFFFFFFE0存放。
BFV Base Address是如何确定的?
是由Build Tool来确定的。在Build出来的bin file位置0xFFFFFFFC存放。
Refer to:
Pre-EFI Initialization Core Interface Version 1.2
为什么要有SEC Phase?
1. 需要用汇编语言来完成C无法处理的工作,如C语言无法处理CPU的特殊寄存器(MSR,MTRR,CRX)。
2. C语言需要Memory当成Stack来处理Local 变数,而刚开机Memory还没有被初始化,还不可用,所以需要CAR(Cache As Ram)的初始化。
3. 让CPU进入Protected Mode(Flat Mode)。
SEC Phase的任务
SEC Phase是整个UEFI Boot过程中的第一个阶段,它主要完成的任务有:
1. 系统上电/重启的入口,处理所有的平台restart events,包括开机,重启,或是各种异常条件下的启动。
2. 创建一块临时的内存区域,在系统内存初始化之前使用,比如用CAR(Cache As Ram)或SRAM。
3. 在安全方面,是信任链的根(the root of trust)。之后模块的任何安全相关的设计都必须有个根,而因为系统开机之后最初的代码实现是在SEC阶段,所以平台设计者在调用PEI Foundation之前可以在SEC阶段验证PEI Foundation的安全性。所以说SEC阶段是系统信任链的根。
4. 传送Handoff信息到PEI Foundation(这才是SEC Phase的最终目的),这些信息包括:
1>.平台的状态,
2>.BFV(Boot Firmware Volume)的位置和大小,
3>.临时RAM的位置和大小,
4>. 栈的位置和大小。
数据结构为:EFI_PEI_STARTUP_DESCRIPTOR。
typedef struct {
UINTN BootFirmwareVolume;
UINTN SizeOfCacheAsRam;
EFI_PEI_PPI_DESCRIPTOR *DispatchTable;
} EFI_PEI_STARTUP_DESCRIPTOR;
另外,还有一个PPI:EFI_SEC_PLATFORM_INFORMATION_PPI 可以用来传送Handoff信息。在SEC_PLATFORM_INFORMATION_PPI.PlatformInformation()中定义了一个EFI_HEALTH_FLAGS,它包含了Processor,hardware,and/or安腾处理器中PLA(Processor Abstract Layer)代码中关于处理器Reset上的状态信息。
SEC阶段代码流程图:
PEI Core Entry Point 是如何确定的?
是由Build Tool来确定的。在Build出来的bin file位置0xFFFFFFE0存放。
BFV Base Address是如何确定的?
是由Build Tool来确定的。在Build出来的bin file位置0xFFFFFFFC存放。
Refer to:
Pre-EFI Initialization Core Interface Version 1.2
相关文章推荐
- UEFI Boot Flow 系列之 SEC Phase
- UEFI Boot Flow 系列之概述
- UEFI Boot Flow 系列之PEI
- UEFI Boot Flow 系列之BDS
- UEFI Boot Flow 系列之 PEI Phase
- UEFI Boot Flow系列之 概述
- UEFI Boot Flow 系列之 PEI Phase
- uefi bds boot flow
- UEFI Boot Flow 系列之 SEC Phase
- UEFI Boot Flow
- UEFI Boot Flow 系列之 SEC Phase
- UEFI Boot Flow
- 深入学习spring-boot系列(二)--使用spring-data-jpa
- 深入学习spring-boot系列(三)--使用thymeleaf模板
- Spring Boot 系列 - 单元测试&网络请求
- Spring Boot干货系列:(二)配置文件解析
- Spring Boot 系列 - web开发 Spring Boot 热部署
- [Spring Boot实战系列] - No.1 开发第一个应用程序 Hello World
- U-BOOT全线移植分析系列之四--U-boot如何引导Linux内核启动?
- Spring Boot系列(六)Spring Boot 连接MySql数据库