TEE OS中断篇(三):中断的向量表

news/2024/4/30 4:38:15/文章来源:https://blog.csdn.net/weixin_45264425/article/details/127165782

REE侧、TEE侧以及Monitor模式或EL3都可接收中断信号。

在系统中存在两个VBAR寄存器和一个MVBAR寄存器,REE侧的VBAR寄存器中存放的是Linux内核的异常向量表基地址,OP-TEE中的VBAR寄存器存放的是OP-TEE系统的中断向量表基地址,而Monitor或者EL3的MVBAR存放的是Monitor模式或EL3运行时的中断向量表基地址,即在Monitor或者EL3阶段是可以接收外部中断信号的。

本节将介绍OP-TEE中断的配置和Monitor或EL3阶段中断的配置。

3.1 ARMv7中Monitor模式的异常向量表

ARMv7架构在ARM扩展出了Monitor模式,Monitor模式属于安全世界状态,用于实现ARM核安全世界状态与正常世界状态之间的切换,且该模式具有独立的中断向量表

使用MVBAR寄存器来保存该运行模式的中断向量表的基地址。在OP-TEE初始化过程中会调用sm_init函数来初始化Monitor模式的配置,并将Monitor模式的中断向量基地址写入到MVBAR寄存器中,该函数内容如下:

        FUNC sm_init , :UNWIND( .fnstart)mrs r1, cpsr //设置Monitor模式使用的栈cps #CPSR_MODE_MONsub sp, r0, #(SM_CTX_SIZE - SM_CTX_NSEC)msr cpsr, r1ldr r0, =sm_vect_table        //将Monitor模式的异常向量表地址保存到r0寄存器中write_mvbar r0         //将Monitor模式的异常向量表基地址写入MVBAR寄存器中bx  lr //返回END_FUNC sm_init

sm_init函数中写入MVBAR寄存器中的值即是Monitor模式下的异常向量表的基地址——sm_vect_table,该向量表的内容如下:

        LOCAL_FUNC sm_vect_table , :UNWIND( .fnstart)UNWIND( .cantunwind)b   .                 /* 重启操作 */b   .                 /* 未定义指令操作 */b   sm_smc_entry    /* smc异常处理函数 */b   .                 /* 执行时的abort操作 */b   .                 /* 数据abort操作 */b   .                 /* 预留 */b   .                 /* IRQ事件 */b   sm_fiq_entry    /* FIQ中断处理入口函数 */UNWIND( .fnend)END_FUNC sm_vect_table

从上述异常向量表中可知,当在Monitor模式下接收到FIQ中断时,系统将会调用sm_fiq_entry函数对该FIQ中断进行处理。

3.2 ARMv8中EL3阶段的异常向量表

ARMv8使用ATF中的bl31作为EL3阶段的代码,其作用与ARMv7中Monitor模式下运行的代码作用一致。

在ATF的启动过程中,bl31通过调用el3_entrypoint_common函数来进行EL3运行环境的初始化,在初始化过程中会执行EL3阶段异常向量表的初始化,EL3的异常向量表的基地址为runtime_exception_vectors。EL3异常向量表的内容如下:

    vector_base runtime_exceptions/*在EL3阶段不接收同步异常,如果产生当作错误处理 */vector_entry sync_exception_sp_el0no_ret  report_unhandled_exceptioncheck_vector_size sync_exception_sp_el0vector_entry irq_sp_el0no_ret  report_unhandled_interruptcheck_vector_size irq_sp_el0vector_entry fiq_sp_el0no_ret  report_unhandled_interruptcheck_vector_size fiq_sp_el0vector_entry serror_sp_el0no_ret  report_unhandled_exceptioncheck_vector_size serror_sp_el0vector_entry sync_exception_sp_elxno_ret  report_unhandled_exceptioncheck_vector_size sync_exception_sp_elxvector_entry irq_sp_elxno_ret  report_unhandled_interruptcheck_vector_size irq_sp_elxvector_entry fiq_sp_elxno_ret  report_unhandled_interruptcheck_vector_size fiq_sp_elxvector_entry serror_sp_elxno_ret  report_unhandled_exceptioncheck_vector_size serror_sp_elx/* AArch64的同步异常处理,smc异常将进入该向量中进行处理 */vector_entry sync_exception_aarch64handle_sync_exceptioncheck_vector_size sync_exception_aarch64/* AArch64的同步异常处理,IRQ事件将进入该向量中进行处理 */vector_entry irq_aarch64handle_interrupt_exception irq_aarch64check_vector_size irq_aarch64/* AArch64的同步异常处理,FIQ事件将进入该向量中进行处理 */vector_entry fiq_aarch64handle_interrupt_exception fiq_aarch64check_vector_size fiq_aarch64vector_entry serror_aarch64no_ret  report_unhandled_exceptioncheck_vector_size serror_aarch64/* AArch32的同步异常处理,smc异常将进入该向量中进行处理 */vector_entry sync_exception_aarch32handle_sync_exceptioncheck_vector_size sync_exception_aarch32/* AArch64的同步异常处理,IRQ事件将进入该向量中进行处理 */vector_entry irq_aarch32handle_interrupt_exception irq_aarch32check_vector_size irq_aarch32/* AArch64的同步异常处理,FIQ事件将进入该向量中进行处理 */vector_entry fiq_aarch32handle_interrupt_exception fiq_aarch32check_vector_size fiq_aarch32vector_entry serror_aarch32no_ret  report_unhandled_exceptioncheck_vector_size serror_aarch32

从异常向量表来看,ARMv8架构中不管是AArch32还是AArch64,当在EL3阶段产生了FIQ事件或者IRQ事件后,bl31将会调用handle_interrupt_exception宏来处理,该宏使用的参数就是产生的异常的标签(handler是应该通过smc id)。

3.3 OP-TEE异常向量的配置

在初始化阶段,OP-TEE异常向量的加载和配置会通过执行thread_init_vbar函数来实现,从初始化起始配置异常向量表的整个调用过程如图12-2所示。

在这里插入图片描述
thread_init_vbar函数在AArch32位系统中的定义如下:

        FUNC thread_init_vbar , :UNWIND( .fnstart)/* 设置VBAR寄存器的值 */ldr r0, =thread_vect_tablewrite_vbar r0bx  lrUNWIND( .fnend)END_FUNC thread_init_vbarKEEP_PAGER thread_init_vbar

thread_init_vbar函数在AArch64位系统中的定义如下:

   FUNC thread_init_vbar , :adr x0, thread_vect_table     //获取OP-TEE异常向量表的基地址msr vbar_el1, x0      //将OP-TEE的异常向量表的基地址写入到VBAR寄存器中retEND_FUNC thread_init_vbarKEEP_PAGER thread_init_vbar //thread_init_vbar函数保存到__keep_meta_vars_pager段中

OP-TEE的AArch32中断向量表内容如下:

    LOCAL_FUNC thread_vect_table , :UNWIND( .fnstart)UNWIND( .cantunwind)b    .  /* Reset */b   thread_und_handler        /* 异常指令处理函数 */b   thread_svc_handler        /* 用于系统调用 */b   thread_pabort_handler     /* abort异常处理函数 */b   thread_dabort_handler     /* 数据abort异常处理 */b    .  /* Reserved */b   thread_irq_handler        /* IRQ事件处理函数 */b   thread_fiq_handler        /* FIQ事件处理函数 */UNWIND( .fnend)END_FUNC thread_vect_tableOP-TEE的AArch64中断向量表内容如下:LOCAL_FUNC thread_vect_table , :.align 7sync_el1_sp0:store_xregs sp, THREAD_CORE_LOCAL_X0, 0, 3b    el1_sync_abortcheck_vector_size sync_el1_sp0.align 7irq_el1_sp0:store_xregs sp, THREAD_CORE_LOCAL_X0, 0, 3b    elx_irqcheck_vector_size irq_el1_sp0.align 7fiq_el1_sp0:store_xregs sp, THREAD_CORE_LOCAL_X0, 0, 3b    elx_fiqcheck_vector_size fiq_el1_sp0.align 7SErrorSP0:b    SErrorSP0check_vector_size SErrorSP0.align 7SynchronousExceptionSPx:b    SynchronousExceptionSPxcheck_vector_size SynchronousExceptionSPx.align 7IrqSPx:b    IrqSPxcheck_vector_size IrqSPx.align 7FiqSPx:b    FiqSPxcheck_vector_size FiqSPx.align 7SErrorSPx:b    SErrorSPxcheck_vector_size SErrorSPx.align 7el0_sync_a64:store_xregs sp, THREAD_CORE_LOCAL_X0, 0, 3mrs    x2, esr_el1mrs    x3, sp_el0lsr    x2, x2, #ESR_EC_SHIFTcmp    x2, #ESR_EC_AARCH64_SVCb.eq   el0_svcb    el0_sync_abortcheck_vector_size el0_sync_a64.align 7el0_irq_a64:store_xregs sp, THREAD_CORE_LOCAL_X0, 0, 3b    elx_irqcheck_vector_size el0_irq_a64.align 7el0_fiq_a64:store_xregs sp, THREAD_CORE_LOCAL_X0, 0, 3b    elx_fiqcheck_vector_size el0_fiq_a64.align 7SErrorA64:b    SErrorA64check_vector_size SErrorA64.align 7el0_sync_a32:store_xregs sp, THREAD_CORE_LOCAL_X0, 0, 3mrs x2, esr_el1mrs x3, sp_el0lsr x2, x2, #ESR_EC_SHIFTcmp x2, #ESR_EC_AARCH32_SVCb.eq     el0_svcb    el0_sync_abortcheck_vector_size el0_sync_a32.align 7el0_irq_a32:store_xregs sp, THREAD_CORE_LOCAL_X0, 0, 3b    elx_irqcheck_vector_size el0_irq_a32.align 7el0_fiq_a32:store_xregs sp, THREAD_CORE_LOCAL_X0, 0, 3b    elx_fiqcheck_vector_size el0_fiq_a32.align 7SErrorA32:b    SErrorA32check_vector_size SErrorA32END_FUNC thread_vect_table

当系统处于OP-TEE中时,系统会到VBAR寄存器中获取OP-TEE的异常向量表基地址,然后根据异常类型获取到FIQ或IRQ事件的处理函数,并对不同的事件进行处理。

针对不同的事件会调用线程向量表thread_vector_table变量中对应的处理函数来完成对该异常事件的处理。

(中断号–》中断处理线程,这里其实我们在之前的线程管理那里有提到,在optee种,有很多的线程,不同的线程提供不同的功能,就是中断号对对应的handler)

下面来看看这个tee os中的线程向量表

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

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

相关文章

android 项目编译报错 符号: 类 shape 位置: 程序包 android.widget

错误 android 项目编译报错 符号: 类 shape 位置: 程序包 android.widget 详细错误 Compiling with JDK Java compiler API. D:\AndroidProjects\ElectronicMall\app\build\generated\data_binding_base_class_source_out\debug\out\com\example\electronicmall\databinding…

keystone变换

文章目录 前言 一、信号模型 1.1 接收信号 1.2 距离脉压 1.3 脉压信号的距离频域方位时域表示 1.4 keystone变换 二、仿真分析 2.1 仿真参数 2.2 仿真结果 总结 前言 在对运动目标进行一维距离成像时 ,目标的运动会造成距离脉压后的距离曲线发生徙动现象&#xff0c…

[C++11 多线程同步] --- 线程同步概述

1 线程调度的几个基本知识点 多线程并发执行时有很多同学捋不清楚调度的随机性会导致哪些问题,要知道如果访问临界资源不加锁会导致一些突发情况发生甚至死锁。 关于线程调度,需要深刻了解以下几个基础知识点: 调度的最小单位是轻量级进程…

移动接入及核心网与移动回传网无信息交互,造成资源浪费

芯片处理能力、终端能力增强 随着智能终端的普及和用户需求的不断发掘,终端芯片和能力都有了飞 速的发展。从 3GPP 的标准化历程来看,终端可以支持的频带数组合增多、 物理层功能不断增强、支持的特性极速增长,当然也伴随着计算存储资源的 叠…

网络规划与部署—ACL命名实验

作者简介:一名在校计算机学生、每天分享网络运维的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.命名ACL 二.标准命名的配置命令 三.ACL命名实验 1.实验要求 2.配置…

部署Apache Flink伪集群

一、准备Apache Flink运行环境 为了运行Flink,只需提前安装好 Java 11。你可以通过以下命令来检查 Java 是否已经安装正确。 1.1 Java 11下载 下载地址:https://www.oracle.com/java/technologies/downloads/#java11 1.2 Java 11安装 sudo rpm -i jdk-11.0.16.1_linux-x6…

大厂SQL题2-多表关联、转化率、打标签

一、红包流向 1.1 某表数据中不在另一个表中出现过的比例 红包发送方用户的基本信息缺失率有多高?(即有多少红包发送方用户无法在用户基本信息表中匹配?) 筛选出相关字段–左连接–不出现的即会为空—用count(1&…

Codeforces Round #785 (Div. 2)

A. Subtle Substring Subtraction 题目链接:Problem - A - Codeforces 样例输入: 5 aba abc cba n codeforces样例输出: Alice 2 Alice 4 Alice 4 Bob 14 Alice 93题意:给定一个长度为n的字符串,然后Alice和Bob轮流…

【JavaDS】浅谈集合LinkedList的使用

✨博客主页: XIN-XIANG荣 ✨系列专栏:【Java实现数据结构】 ✨一句短话: 难在坚持,贵在坚持,成在坚持! 文章目录一. 什么是LinkedList?二. LinkedList的使用1. 构造方法2. 常用方法3. LinkedList的遍历三. ArrayList和LinkedList的区别一. 什么是LinkedList? LinkedList的底…

什么是虚拟计算机集群

这个问题来自近期几位网友的私信,他们不约而同问到一个问题:什么是虚拟计算机集群?Laxcus分布式操作系统是如何做的?下面就正式回答一下这个问题。 在我们传统的认知里,或者大家平常比较多接触的,都…

Linux基本使用

文章目录一.Linux的安装1.Linux系统的安装方式2.网卡设置3.安装SSH连接工具4.Linux和Windows目录对比二.Linux命令1.Linux常用命令2.文件目录操作命令三.软件安装1.软件安装方式一.Linux的安装 1.Linux系统的安装方式 (1)物理机安装:直接将…

NVMe系列专题之六:电源管理

NVMe协议其中有一项优势,就是低功耗!为了达成这个目标,NVMe中加入了自动电源状态转换和动态电源管理机制。 先来看一下NVMe Spec中对动态电源管理的描述图: 1. Host设定性能和功耗: Power Objective和Performance Objective。 2. Host通知Controller更改设备的power state。…

tf.pad()

参考 tf.pad - 云社区 - 腾讯云 tf.pad(tensor,paddings,modeCONSTANT,nameNone,constant_values0 )pad一个张量。 这个操作根据指定的paddings填充一个tensor。padding是一个形状为[n, 2]的整数张量,其中n是张量的秩。对于输入的每个维度D,paddings[D, …

Python数据分析之单变量分析

0 引言 在数据分析或者机器学习过程中,我们需要对变量或者特征进行分析,在分析过程中,一般都会分为两种:单变量分析、双变量分析。今天,土豆简单介绍一下单变量分析,单变量分析主要对单个变量或者特征进行…

基金入门笔记

什么是基金 基金概念【fund】为了某种目的设立的具有一定规模的资金(保险金、公积金也可以理解为其中的一种)但是平常说的指的是证券投资基金。证券包含债券 股票和期货。而证券投资基金是由基金公司 保险工资或者银行推出的 从众多投资者处募集巨额资金…

【易购管理系统】导航折叠效果

在el-menu中添加 v-model“isCollapse” <el-menu router"true"default-active"/"class"el-menu-vertical-demo"background-color"#545c64"text-color"#fff"active-text-color"#ffd04b"v-model"isCollap…

[Java]通过反射获取运行时类的对象及其内部结构

文章目录1. 创建运行时类的对象2. 体会反射的动态性3. 通过反射获取运行时类的结构3.1 用于测试的类的准备3.2 获取运行时类的属性3.2.1 getFields()3.2.2 getDeclaredField()3.2.3 获取属性的结构3.3 获取运行时类的方法3.3.1 getMethods()3.3.2 getDeclaredMethods()3.3.3 获…

美食篇:大闸蟹与梭子蟹的区别

文章目录大闸蟹梭子蟹区别总结吃蟹子的季节大闸蟹 梭子蟹 区别总结 大闸蟹香&#xff0c;小&#xff0c;有黄 梭子蟹鲜&#xff0c;大&#xff0c;无黄 小的梭子蟹也有黄&#xff0c;小的便宜 总结&#xff1a;浓缩的都是精华&#xff01;个头大的不一定好吃&#xff0c;但一…

面积结构设计

面积结构设计 针对面积的拓扑是尽可能最大程度地复用逻辑资源,常常以流量(速度)为代价。 1、折叠流水线 折叠流水线可以优化在流水线赋值逻辑的流水线设计的面积。 定点的分数乘法器。A表示定点刚好在最低有效位(LSB)右边的归一化整数格式,输入B的定点刚好在最高有效…

Torch

张量 Tensor torch.is_tensor[source] torch.is_tensor(obj) 如果obj是一个pytorch张量&#xff0c;则返回True torch.is_storage(obj) torch.set_default_tensor_type(t) 设置pytorch中默认的浮点类型&#xff0c;一般使用pytorch进行运算时候使用的都是浮点数来进行计算…