armv8/armv9不同特权程序之间的跳转模型

2024-03-11 16:44

本文主要是介绍armv8/armv9不同特权程序之间的跳转模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

        • 1、前言
        • 2、4个特权等级/4个安全状态之间的跳转模型
        • 3、启动时镜像之间的跳转模型
        • 4、runtime程序之间的跳转模型
        • 推荐

本文转自 周贺贺,baron,代码改变世界ctw,Arm精选, armv8/armv9,trustzone/tee,secureboot,资深安全架构专家,11年手机安全/SOC底层安全开发经验。擅长trustzone/tee安全产品的设计和开发。

思考:
1、我们知道arm有2个执行状态:aarch32/aarch64,他们之间是如何跳转,如何切换的/
2、我们知道arm有4个安全状态:secure security/non-secure security/ Root/ Realm,他们之间是如何跳转,如何切换的?
3、我们知道arm有4个特权级别:secure security/non-secure security,他们之间是如何跳转,如何切换的?
4、在开机启动是,有着不同的阶段,如bootrom、bootloader、kernel,他们都是64位的? 他们之间都是怎样跳转和切换的?
5、uboot怎样切换到Linux Kernel的?


说明:
1、以下知识点,看似简单和清晰,实则零散在整个10000多页的ARM TRM之中,另外也有许多理论知识在实践中不常见。所以也许会有描述不准确的地方(但但致都是准确的),精确的学习还是请以ARM TRM官方文档为准。
2、本文注重讲解基础原理。实战经验中,真的没办法去说,因为很多SOC厂家会视为他们的启动流程为机密吧,受到NDA保护。

如果你看到了这里 :,那么恭喜你,您已经看到了ARM最最最最精髓的地方了。我早就说过:学习安全其实就是学习ARM架构、学习ARM架构其实就是学习4个特权等级、4个安全状态、2个执行状态之间是如何切来切去的. 本文将详细介绍这些知识点。

1、前言

注意本文标题所说的“程序之间的跳转模型”,主要讲解如下这么样子的大系统大程序之中:
在这里插入图片描述

  • 启动时镜像之间是如何跳转的
  • runtime是镜像之间是如何跳转的

阅读本文需要一点点基础,请自行补习:

  • 4个特权等级、4个安全状态、2个执行状态
  • 启动模型中的BL1 BL2 BL31 BL32 BL33的概念
2、4个特权等级/4个安全状态之间的跳转模型

先弄懂最最最基础的本质原理,10000多页的ARM TRM文档散装了很多场景, 我们总结之后再总结,最后浓缩成了下面这一张框图,通常我们也只要理解下面这张图就可以了:
在这里插入图片描述
其中:

  • EL0的所有异常(同步异常和异步异常)都可以将core切到EL1中
  • EL1的所有异步异常、hvc/smc指令 都可以将core切到EL2中
  • EL2的所有异步异常、smc指令 都可以将core切到EL3中
  • 所有的返回指令,都是ERET

其实呢,下面这种情况也是可以出现的,(只不过呢查略大多数代码,我都没有找到这样使用的例子)
在这里插入图片描述
另外呢svc也是可以被trapped到EL2的,EL3调用ERET返回EL1时,也是可以被EL2 trapped的,即下面这种情况也是可以出现的, (只不过呢查略大多数代码,我也没有找到这样使用的例子)
在这里插入图片描述

3、启动时镜像之间的跳转模型

由于这些底层的东西,都会和具体的SOC厂家的设计强相关,所以我们也就只好介绍common的场景。

很多人都学习过Secure Boot或是即将学习Secure boot,他们的重点也许都放在了如何签名验签的地方。
那么你知道BL1到BL2是怎样跳转? uboot到kernel是怎样跳转的吗?

以下是参在TF-A代码做出的总结,当然了也是比较理想的场景:
在这里插入图片描述

可是在你的实际使用中:

  • BL32可能不是S-EL1,也是有可能是S-EL2的
  • BL33可能不是EL1,也是有可能是EL2的
  • BL1 BL2 BL33 BL32 BL33 每一级镜像,也许不是aarch64的,也许是aarch32的

如上的场景中,看似也就那么回事吧,无非就是不同特权等级之间,调用同步异常指令或返回指令,切来切去而已。那么如果是相同的特权等级,那么如何切换呢?

如uboot(EL1)到kernel(EL1), 至少有以下三种方式(其实我还能列出第4种第5种,这里留给大家思考):
在这里插入图片描述

如下再展示了一个稍微复杂的场景,aarch64和aarch32掺杂地使用,也许你的SOC就是这样设计的哦:
在这里插入图片描述

4、runtime程序之间的跳转模型

在这里插入图片描述
在runtime模型中,你的cpu可能会同时在aarch32和aarch64之间运行,aarch32和aarch64之间的切换,其实也很好理解,模型如下所示,就是进入高特权等级,切换一下cpu context而已。
在这里插入图片描述
燃鹅,以上依然是最理想的场景吧。在实际使用中,也许你会有各种各样的需求,例如:我不想跳转特权等级,但还想切换执行状态。
比如你的SOC实现定义了EL3,你的EL3既aarch32的程序,也有aarch64的程序,那么两个程序是如何切换的呢?

在这里插入图片描述
这个时候,利用同步异常/异步异常的知识点已经无法满足需求了,可能就得利用架构中的warm reset技术了。
例如,你可以在aarch32的程序中去写RMR_EL3的相关比特,触发warm reset, cpu复位进入提前设置好的RVBAR_EL3的地址出,进入aarch64程序。 其实还真有很多厂家,使用这种方式完成的镜像之间的跳转。


推荐
  • ARMv8/ARMv9架构从入门到精通 --博客专栏
  • 《Armv8/Armv9架构从入门到精通 第二期》 --大课程
  • 8天入门ARM架构 --入门课程

这篇关于armv8/armv9不同特权程序之间的跳转模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/798411

相关文章

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

2. c#从不同cs的文件调用函数

1.文件目录如下: 2. Program.cs文件的主函数如下 using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace datasAnalysis{internal static

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

uva 10061 How many zero's and how many digits ?(不同进制阶乘末尾几个0)+poj 1401

题意是求在base进制下的 n!的结果有几位数,末尾有几个0。 想起刚开始的时候做的一道10进制下的n阶乘末尾有几个零,以及之前有做过的一道n阶乘的位数。 当时都是在10进制下的。 10进制下的做法是: 1. n阶位数:直接 lg(n!)就是得数的位数。 2. n阶末尾0的个数:由于2 * 5 将会在得数中以0的形式存在,所以计算2或者计算5,由于因子中出现5必然出现2,所以直接一

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*