安全引导功能及ATF的启动过程(五)

安全引导功能及ATF的启动过程(五)

ATF中bl32的启动

bl31中的runtime_svc_init函数会初始化OP-TEE对应的服务,通过调用该服务项的初始化函数来完成OP-TEE的启动。对于OP-TEE的服务项会通过DECLARE_RT_SVC宏在编译时被存放到rt_svc_des段中。该段中的init成员会被初始化成opteed_setup函数,由此开始进入到OP-TEE OS的启动。整个流程如图所示。

在这里插入图片描述

DECLARE_RT_SVC

DECLARE_RT_SVC分为两种类型:

/* Define an OPTEED runtime service descriptor for fast SMC calls */
//对于快速的SMCs中断,OP-TEE操作系统将在入口堆栈上执行,
//   期间屏蔽IRQ/FIQ中断,直至执行返回到正常世界。
DECLARE_RT_SVC(opteed_fast,OEN_TOS_START,OEN_TOS_END,SMC_TYPE_FAST,opteed_setup,opteed_smc_handler
);/* Define an OPTEED runtime service descriptor for yielding SMC calls */
//对于让步型SMCs中断,OPTEE OS将会在
//        某个时刻解除对中断的屏蔽,执行所请求的服务。
DECLARE_RT_SVC(opteed_std,OEN_TOS_START,OEN_TOS_END,SMC_TYPE_YIELD,NULL,opteed_smc_handler
);

opteed_setup函数

该函数是ATF启动OP-TEE的入口函数,该函数会查找到OP-TEE镜像的信息、检查OP-TEE的入口函数指针是否有效、设置OP-TEE运行的上下文,然后调用OP-TEE的入口函数,开始执行OP-TEE的启动。该函数的内容如下:

/root/optee/trusted-firmware-a/services/spd/opteed/opteed_main.c

/******************************************************************************** OPTEE Dispatcher setup. The OPTEED finds out the OPTEE entrypoint and type* (aarch32/aarch64) if not already known and initialises the context for entry* into OPTEE for its initialization.******************************************************************************/static int32_t opteed_setup(void)
{
//延迟加载模式
#if OPTEE_ALLOW_SMC_LOADopteed_allow_load = true;INFO("Delaying OP-TEE setup until we receive an SMC call to load it\n");/** We must register the interrupt handler now so that the interrupt* priorities are not changed after starting the linux kernel.*///预先注册中断处理程序,确保在 Linux 内核启动后,//           中断优先级不会被改变。 register_opteed_interrupt_handler();return 0;
#elseentry_point_info_t *optee_ep_info;uint32_t linear_id;uint64_t arg0;uint64_t arg1;uint64_t arg2;uint64_t arg3;struct transfer_list_header *tl = NULL;struct transfer_list_entry *te = NULL;void *dt = NULL;linear_id = plat_my_core_pos();  //获取当前核心的线性ID/** Get information about the Secure Payload (BL32) image. Its* absence is a critical failure.  TODO: Add support to* conditionally include the SPD service*///SECURE:获取 BL32(即 OP-TEE)的入口信息。// NON_SECURE: 获取 BL33(即 REE)的入口信息。optee_ep_info = bl31_plat_get_next_image_ep_info(SECURE);if (!optee_ep_info) {WARN("No OPTEE provided by BL2 boot loader, Booting device"" without OPTEE initialization. SMC`s destined for OPTEE"" will return SMC_UNK\n");return 1;}/** If there's no valid entry point for SP, we return a non-zero value* signalling failure initializing the service. We bail out without* registering any handlers*///检查入口地址有效//pc 是程序计数器(Program Counter),即 OP-TEE 的入口地址。 if (!optee_ep_info->pc)return 1;//optee_ep_info结构体定义在下方tl = (void *)optee_ep_info->args.arg3;// 解析 Transfer List(可选参数传递机制)//   Transfer List:一种链式结构,允许 BL2 向//   BL31 传递任意类型的数据(FDT、内存表、版本信息等)。if (TRANSFER_LIST && transfer_list_check_header(tl)) {//查找 FDT 条目, Flattened Device Tree(FDT)te = transfer_list_find(tl, TL_TAG_FDT);//提取设备树指针dt = transfer_list_entry_data(te);//获取 OP-TEE 的执行状态(AArch32 或 AArch64)opteed_rw = GET_RW(optee_ep_info->spsr);if (opteed_rw == OPTEE_AARCH64) {if (optee_ep_info->args.arg1 !=TRANSFER_LIST_HANDOFF_X1_VALUE(REGISTER_CONVENTION_VERSION))return 1;//64位下为arg0赋值arg0 = (uint64_t)dt;arg2 = 0;} else {if (optee_ep_info->args.arg1 !=TRANSFER_LIST_HANDOFF_R1_VALUE(REGISTER_CONVENTION_VERSION))return 1;//32位下为arg1赋值arg0 = 0;arg2 = (uint64_t)dt;}//统一设置其余参数arg1 = optee_ep_info->args.arg1;arg3 = optee_ep_info->args.arg3;} else {/* Default handoff arguments */opteed_rw = optee_ep_info->args.arg0;arg0 = optee_ep_info->args.arg1; /* opteed_pageable_part */arg1 = optee_ep_info->args.arg2; /* opteed_mem_limit */arg2 = optee_ep_info->args.arg3; /* dt_addr */arg3 = 0;}// 初始化 OP-TEE 执行上下文opteed_init_optee_ep_state(optee_ep_info, opteed_rw, optee_ep_info->pc,arg0, arg1, arg2, arg3,&opteed_sp_context[linear_id]);/** All OPTEED initialization done. Now register our init function with* BL31 for deferred invocation*///所有 OPTEED 初始化已完成。// 现在将我们的初始化函数注册到 BL31,以便延迟调用。 bl31_register_bl32_init(&opteed_init);return 0;
#endif  /* OPTEE_ALLOW_SMC_LOAD */
}

entry_point_info_t结构体

定义如下:

/root/optee/trusted-firmware-a/include/export/common/ep_info_exp.h

typedef struct aapcs64_params {uint64_t arg0;uint64_t arg1;uint64_t arg2;uint64_t arg3;uint64_t arg4;uint64_t arg5;uint64_t arg6;uint64_t arg7;
} aapcs64_params_t;typedef struct aapcs32_params {uint32_t arg0;uint32_t arg1;uint32_t arg2;uint32_t arg3;
} aapcs32_params_t;/****************************************************************************** This structure represents the superset of information needed while* switching exception levels. The only two mechanisms to do so are* ERET & SMC. Security state is indicated using bit zero of header* attribute* NOTE: BL1 expects entrypoint followed by spsr at an offset from the start* of this structure defined by the macro `ENTRY_POINT_INFO_PC_OFFSET` while* processing SMC to jump to BL31.*****************************************************************************/
typedef struct entry_point_info {param_header_t h;uintptr_t pc;uint32_t spsr;
#ifdef __aarch64__aapcs64_params_t args;
#elseuintptr_t lr_svc;aapcs32_params_t args;
#endif
} entry_point_info_t;

opteed_init函数

该函数的地址会被赋值给bl32_init变量,在bl31_main函数中会被调用,主要用来完成启动OP-TEE的设置。该函数内容如下:

/root/optee/trusted-firmware-a/services/spd/opteed/opteed_main.c

#if !OPTEE_ALLOW_SMC_LOAD
//只有当 OPTEE_ALLOW_SMC_LOAD 未定义 时,这段代码才被编译进去。
static int32_t opteed_init(void)
{entry_point_info_t *optee_entry_point;/** Get information about the OP-TEE (BL32) image. Its* absence is a critical failure.*///SECURE:获取 BL32(即 OP-TEE)的入口信息。 optee_entry_point = bl31_plat_get_next_image_ep_info(SECURE);//完成 上下文恢复 + 跳转到 OP-TEEreturn opteed_init_with_entry_point(optee_entry_point);
}
#endif  /* !OPTEE_ALLOW_SMC_LOAD */

opteed_init_with_entry_point函数

这个函数真正完成 上下文恢复 + 跳转到 OP-TEE 的逻辑。

/root/optee/trusted-firmware-a/services/spd/opteed/opteed_main.c

/******************************************************************************** This function passes control to the OPTEE image (BL32) for the first time* on the primary cpu after a cold boot. It assumes that a valid secure* context has already been created by opteed_setup() which can be directly* used.  It also assumes that a valid non-secure context has been* initialised by PSCI so it does not need to save and restore any* non-secure state. This function performs a synchronous entry into* OPTEE. OPTEE passes control back to this routine through a SMC. This returns* a non-zero value on success and zero on failure.******************************************************************************/
static int32_t
opteed_init_with_entry_point(entry_point_info_t *optee_entry_point)
{//获取当前核心 IDuint32_t linear_id = plat_my_core_pos();//获取当前核心的 OP-TEE 上下文optee_context_t *optee_ctx = &opteed_sp_context[linear_id];uint64_t rc;assert(optee_entry_point);//初始化当前核心的上下文//cm:Context Managementcm_init_my_context(optee_entry_point);/** Arrange for an entry into OPTEE. It will be returned via* OPTEE_ENTRY_DONE case*///执行同步跳转 rc = opteed_synchronous_sp_entry(optee_ctx);//如果返回了 0,说明异常,系统崩溃assert(rc != 0);return rc;
}

上下文管理职责划分:

安全上下文(Secure Context)SPD(如opteed_setup()为 TEE(如 OP-TEE)准备 S-EL1/S-EL0 状态
非安全上下文(Non-secure Context)PSCI 模块为 Normal World(如 Linux)准备 EL1/EL0 状态

ATF启动过程小结

ATF作为最底层固件,OP-TEE OS、BootLoader、Linux内核的加载都是由ATF来完成的,而且ATF实现了安全引导的功能。BL31运行于EL3,待系统启动完成后,在REE侧或TEE侧触发的安全监控模式调用(SMC)都会进入BL31中被处理。OP-TEE启动完成后会返回一个包含用于处理各种类型的安全监控模式调用的函数指针结构体变量,该变量会被添加到BL31的处理句柄中,用于处理REE侧触发的安全监控模式调用。BL2启动时通过触发安全监控模式调用通知BL1将CPU控制权限交给BL31。BL31通过解析特定段中是否存在OP-TEE的入口函数指针来确定是否需要加载OP-TEE。OP-TEE启动后会触发安全监控模式调用重新进入到BL31中继续执行。BL31通过查询链表的方式获取下一个需要被加载的REE侧镜像文件,并设定好REE侧运行时CPU的状态和运行环境,然后退出EL3进入REE侧镜像文件的启动。一般第一个REE侧镜像文件为BootLoader,BootLoader会加载Linux内核。

参考资料:

  • 《手机安全和可信应用开发指南:TrustZone与OP-TEE技术详解》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/918335.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/918335.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Numpy科学计算与数据分析:Numpy入门之多平台安装与基础环境配置

Numpy环境搭建与基础操作 学习目标 本课程将指导学员在Windows、macOS和Linux三种操作系统上安装Numpy,并配置开发环境,包括使用Jupyter Notebook和Spyder等IDE的基本操作。通过本课程的学习,学员将能够独立搭建Numpy开发环境,并…

内存溢出的原因有哪些,如何排查线上问题?

1. java.lang.OutOfMemoryError: ......java heap space..... 堆栈溢出,代码问题的可能性极大 2. java.lang.OutOfMemoryError: GC over head limit exceeded 系统处于高频的GC状态,而且回收的效果依然 不佳的情况,就会开始报这个错误&…

Cesium 无人机视角飞行漫游,截屏

1.实现Cesium模拟无人机离屏渲染,无人机视角飞行漫游。视锥体显示 具体效果如下地址: 【CESIUM无人机视角飞行截屏】 https://www.bilibili.com/video/BV1zQ89zGE14/?share_sourcecopy_web&vd_source8239ec37df07d6a5d56c9ece00146783

vscode 打开设置

目录 方法 1(快捷键): 方法2,界面操作,有时没有 方法 1(快捷键): 按下:Cmd Shift P 输入并选择:Preferences: Open Settings (JSON) 方法2,…

繁花深处:花店建设的时代意义与多元应用—仙盟创梦IDE

花店当第一缕晨光透过花店的玻璃窗,落在带着露水的玫瑰花瓣上时,这个空间便不再只是商品交易的场所。花店作为城市肌理中充满生命力的细胞,承载着远比销售鲜花更丰富的社会意义。在快节奏的现代生活中,一束鲜花的绽放不仅是自然之…

AtomicStampedReference解决方案

1、通过引入版本戳(stamp)机制解决ABA问题: 每次修改时递增版本号执行CAS时同时检查值和版本号即使值相同但版本不同,操作也会失败2、具体代码实现 import java.util.concurrent.atomic.AtomicStampedReference;public class AtomicStampedReferenceDemo…

版本控制的详细说明介绍(已有github账号版)

说明 如果已经有一个GitHub账号,这是一个很好的起点!版本控制是一个帮助你管理代码或其他文件变化的工具,就像给你的项目加了一个“时间机器”,可以随时回溯历史、协作编辑,而不会乱套。下面我将从基础开始,层层展开说明。整个内容分为几个部分:介绍、原理、用途、操作…

基于Github Pages搭建个人博客站点:hexo环境搭建、本地预览与发布

步骤确认 Hexo 博客的源文件在哪里安装 Hexo 命令行工具:npm install -g hexo-cli在源文件目录中使用 hexo new "文章标题" 创建新文章编辑生成的 Markdown 文件使用 hexo generate 生成静态文件使用 hexo deploy 部署到这个 GitHub Pages 仓库设置Hexo博…

Shell脚本实现自动封禁恶意扫描IP

iptables 简介我们使用iptables工具实现功能iptables 是 Linux 系统上最常用的防火墙工具,可以指定策略。Shell文件创建首先我们先创建文件scanners.shvim /usr/local/bin/auto_block_ip.sh我的目标是每10分钟自动扫描,再10分钟内一个IP访问50次以上就就…

LeetCode_哈希表

哈希表(散列表)一、哈希表二、有效的字母异位词1、有效的字母异位词(力扣242)2、赎金信(力扣383)3、字母异位词分组(力扣49)4、找到字符串中所有字母异位词(力扣438)三、两个数组的交集1、两个数组的交集(力扣349)2、两个数组的交集 II(力扣350)三、其他…

2.变量和常量

1.变量2.2 变量的基本使用2.3 变量的本质 2.4 变量命名规则与规范 2.5 变量拓展-数组 1.数组的基本使用 2.常量

Java并发核心基础解析

目录 一、背景 二、Java线程模型 三、Synchronized实现原理 3.1 锁的使用 3.2 解释执行 3.3 JIT执行 3.4 锁的状态 3.5 monitorenter 3.5.1 偏向锁 3.5.2 轻量级锁 3.5.3 重量级锁 3.6 monitorexit 3.6.1 偏向锁 3.6.2 轻量级锁 3.6.3 重量级 四、可见性的真相…

线程池111

线程池框图C语言线程池详解:从基础到实现通俗理解线程池想象你开了一家快递站,每天要处理很多包裹派送:​没有线程池​:每来一个包裹就雇一个新快递员,送完就解雇问题:频繁招聘解雇成本高(线程创…

Qt-Advanced-Docking-System

直译一下 : 先进的停靠系统 github: mfreiholz/Qt-Advanced-Docking-System: Advanced Docking System for Qt 这是这个项目的起源 这个最后一次更新: githubuser0xFFFF/Qt-Advanced-Docking-System: Advanced Docking System for Qt 这是另一个人复刻…

湖南(源点咨询)市场调研 如何在行业研究中快速有效介入 中篇

我们接着起头篇来说迈克尔波特认为一个行业内存在着五种基本竞争力量,即潜在入侵者、替代产品、供方、需方以及行业内现有竞争者。如附图:即:同行业内现有竞争者的竞争能力、潜在竞争者进入的能力、替代品的替代能力、供应商的讨价还价能力、…

【无标题】消息队列(Message Queue)是一种**进程间通信(IPC)机制

消息队列(Message Queue)是一种进程间通信(IPC)机制,它允许进程通过在队列中添加和读取消息来交换数据。与管道(命名/匿名)相比,消息队列具有结构化消息、异步通信和消息持久化等特点…

mac中多版本JDK配置和切换

下载 从jdk官网下载即可,找到自己要用的版本。 官网:https://www.oracle.com/java/technologies/downloads/#jdk21-mac 我这里下载的jdk1.8和21。 根据自己芯片下载,一般都是m芯片。下载好后,点击,一直下一步就行&…

【JVM】流程汇总

【JVM】流程汇总【一】编译过程和内存分布【1】案例程序:简单的 Java 类【2】Java 编译过程:从.java到.class(1)编译命令(2)编译结果(3)字节码的作用【3】Java 运行过程:…

专业MP3瘦身工具WinMP3Shrink 1.1,绿色单文件,极速压缩

[软件名称]: 专业MP3瘦身工具WinMP3Shrink 1.1 [软件大小]: 1.1 MB [软件大小]: 夸克网盘 | 百度网盘 软件介绍 WinMP3Shrink 是一款免费的 MP3 压缩软件,能够有效减少 MP3 文件的体积,同时还能增强音质。即使不重新编码,通过移除保留空间…

LeetCode 每日一题 2025/8/4-2025/8/10

记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录8/4 904. 水果成篮8/5 3477. 水果成篮 II8/6 3479. 水果成篮 III8/7 3363. 最多可收集的水果数目8/8 808. 分汤8/9 231. 2 的幂8/10 869. 重新排序得到 2 的幂8/4 904. 水果…