当前位置: 首页 > news >正文

【UEFI系列】SEC阶段讲解

UEFI系列文章目录

第一章 SEC阶段讲解


文章目录

  • UEFI系列文章目录
  • 前言
  • 一、SEC阶段
  • 二、Framework architecture框架架构
    • 1.UEFI架构里的SEC
    • 2.SEC在bios rom的位置分布
  • 三、SEC Core code flow


前言

众所周知,UEFI bios分为四个阶段:SEC、PEI、DXE、BDS,运行完毕才能进到setup界面或是进入操作系统。
x86平台较为经典,而ARM在UEFI之前需要运行ATF(Arm Trusted Firmware),ATF做了SEC和PEI的部分工作,且ARM部分平台不需要PEI。
在这里插入图片描述

这篇文章着重介绍UEFI bios的SEC阶段。


提示:以下皆基于x86 UEFI bios

一、SEC阶段

SEC: The Security Phase 安全验证阶

1.为什么需要SEC?

  • 上电后部分操作需要用汇编代码来实现。
    (C代码无法控制某些CPU的寄存器,比如MSR、MTRR、CRx)
  • 内存在SEC阶段还没有初始化好,用CPU的缓存来做Cache As RAM运行代码。
  • 将CPU从16位实模式(real mode)切换到32位(传统x86架构中,现代x86也支持64位)保护模式(protected mode/flat mode)

2.SEC阶段做了哪些事情?

  • CPU初始化
    1.CPU进入保护模式
    2.寄存器(MSR、MTRR、CRx等)初始化
    3.Cache As Ram把CPU的缓存初始化为内存使用

  • 过渡到PEI阶段切换成C代码执行
    (将控制转移到PEI阶段-包括有关BFV(Basic Firmware Volume基本固件卷)、堆栈、CAR的信息)

3.SEC特性
· 代码越短越好。
· 使用汇编语言。
· 不同平台(CPU)厂商SEC代码不同。
· 接收并处理系统启动和重启信号。

4.总结
(1)作为可信系统的根
(2)初始化CPU特殊寄存器
(3)实模式切换为保护模式
(4)Cache As RAM,CPU缓存作为运行内存,执行汇编代码
(5)接收并处理系统启动和重启信号
(6)传递系统参数给PEI阶段(系统当前状态,PEI根据状态值判断系统当前的健康情况/可启动固件的地址和大小,PEI据此判断可用硬件/临时RAM区域的地址和大小/栈的地址和大小)

二、Framework architecture框架架构

1.UEFI架构里的SEC

在这里插入图片描述
一上电就开始跑SEC。PEI回去install memory,然后代码就会在内存里跑(之后内存可用后CPU cache又会恢复成只读)。

2.SEC在bios rom的位置分布

bios rom一般是8/16/32M,不同平台不同大小和文件后缀(.bin .hpm等等)。
映射到内存寻址空间:

±----------------------+ 0xFFFFFFF
|   SEC     | — FV_BB (boot block)
±----------------------+
|    PEI     | — FV_BB
±----------------------+
|   DXE/BDS   | — FV_MAIN
±----------------------+
|   NVRAM    | — FV_NVRAM(存变量的可更改区域)
±----------------------+

SEC执行的第一行真正执行代码(不算nop)是汇编jmp,在0xFFFFFFF0处3-5字节(视前面的nop,有偏移),实际上并不是占满0xFFFFFFFF。

三、SEC Core code flow

  • Power on: 0xFFFFFFF0
    ResetVec.asm 的标签resetVector开始执行 (形如这些,具体文件名和标签不一定相同,各平台明明不同,但都是跑16位实模式的汇编)
    代码如下(示例):
ALIGN   16
resetVector:nopnopjmp     EarlyBspInitReal16
ALIGN   16
fourGigabytes:

resetVector标签里jmp之前有没有nop,resetVector的地址都是0xFFFFFFF0,例如这里的代码jmp会在0xFFFFFFF2开始。
位置就是用 ALIGN 16 和 fourGigabytes: 来确定它在4G寻址最末尾16字节。

  • Flat32.asm 实模式(16位)转为保护模式
    不一定叫这个,各家代码不一样,也可能叫Real16ToFlat32.asm之类的。
    总之就是jmp EarlyBspInitReal16后执行代码再跳转跳转跳转到地方。

  • Cache As Ram

  • 控制权交给PEI(有地方会调SecStartup in SecMain.c
    执行函数SecStartup,再调到SecStartupPhase2函数(这俩函数都是NORETURN类型,跳走了就走了)。
    SecStartupPhase2中途调用FindPeiCore.c里的FindAndReportEntryPoints函数,调用完后继续执行。
    最后(SecStartupPhase2末尾):

(*PeiCoreEntryPoint)(SecCoreData, PpiList); //各家代码不同,大概是这样子

带着SEC时候的信息SecCoreData就去PEI了。


问:SEC什么时候可以执行C代码的?
答:CAR、堆栈建立完成后。


文章转载自:

http://Oqhc5YDu.Lhrcr.cn
http://W3MVsMVM.Lhrcr.cn
http://SgtAQ8ez.Lhrcr.cn
http://PtwWQcPC.Lhrcr.cn
http://CdzuQ16Y.Lhrcr.cn
http://pp9wYQSz.Lhrcr.cn
http://Whd7FzFY.Lhrcr.cn
http://ksAqycav.Lhrcr.cn
http://3wuRWxzz.Lhrcr.cn
http://dKTmxwi4.Lhrcr.cn
http://VWAgW5Ix.Lhrcr.cn
http://dTFBsZxG.Lhrcr.cn
http://ZPo6Y9wh.Lhrcr.cn
http://O8lCaJB6.Lhrcr.cn
http://sDyNwgZd.Lhrcr.cn
http://YeaCIamP.Lhrcr.cn
http://tj4ngO3s.Lhrcr.cn
http://daHRDuBR.Lhrcr.cn
http://vdeGQxVK.Lhrcr.cn
http://cAAPJfd8.Lhrcr.cn
http://UOHqUJHq.Lhrcr.cn
http://clmH4hHP.Lhrcr.cn
http://HypqmaES.Lhrcr.cn
http://QggmLcux.Lhrcr.cn
http://B3NdUpDC.Lhrcr.cn
http://x9XD1Skp.Lhrcr.cn
http://NcL54OMk.Lhrcr.cn
http://czBlGC0s.Lhrcr.cn
http://mzX5ue7j.Lhrcr.cn
http://cZS4NFSK.Lhrcr.cn
http://www.dtcms.com/a/235802.html

相关文章:

  • 嵌入式开发之STM32学习笔记day22
  • solidity中sar和>>的区别
  • gvim比较两个文件不同并合并差异
  • 【人工智能】一些基本概念
  • C++_哈希表
  • 智能运维如何让变电所“无人值守”还能降本增效?
  • 3步布局关键词让流量更精准
  • 【八股消消乐】MySQL参数优化大汇总
  • 工业级智能手持终端8160使用说明
  • MySQL的优化部分介绍
  • TOIS24-可解释推荐|特征增强神经协同推理
  • python queue
  • 7. 线性表的定义及特点
  • Java并发编程面试题
  • Python应用break初解
  • 普中STM32F103ZET6开发攻略(六)
  • 快速幂(迭代和递归)
  • 任意类加载环境下注入内存马
  • Unity优化篇之DrawCall
  • Vue.js 生命周期全面解析
  • 宁乡地-气-碳-水相互作用综合观测数据集
  • 香港科技大学(广州) | 生命科学与生物医学工程学域博士夏令营报名召集!
  • 基于JWT+SpringSecurity整合一个单点认证授权机制
  • 在UI界面内修改了对象名,在#include “ui_mainwindow.h“没更新
  • 探索Python融合地学:斗之气三段
  • 深度解构Vue3响应式内核:Proxy魔法与依赖追踪的极致艺术
  • 1.4 编译库:静态库、动态库
  • Java并发容器和原子类
  • caliper中的测试文件写法及其注意事项
  • 谷歌云代理商 | 游戏行业专属方案:谷歌云实时多人游戏服务器架构