linux ARM64 异常

linux 的系统调用是通过指令陷入不同异常级别实现的。arm64 架构的 cpu 的异常级别结构如下:

在上图中,用户层运行在 EL0 也就是异常级别 0,Linux 内核运行在 EL1 也就是异常级别 1,安全可信操
作系统运行在异常级别 2:EL2,安全监控模块运行在异常级别 3:EL3。
上述提到的用户层和内核大家都熟悉,为了介绍异常级别的完整性,我们简单说一下这里的 EL2 和 EL3,
这两个异常级别实际为了实现 TEE(Trusted Execution Environment)即可信执行环境的一种硬件架构,在 ARM 上
称之为 TrustZone,TrustZone 是 ARM 针对消费电子设备设计的一种硬件架构,其目的是为消费电子产品构建
一个安全框架来抵御各种可能的攻击。TrustZone 在概念上将 SoC 的硬件和软件资源划分为安全(Secure World)
和非安全(Normal World)两个世界,所有需要保密的操作在安全世界执行(如指纹识别、密码处理、数据加解密、
安全认证等),其余操作在非安全世界执行(如用户操作系统、各种应用程序等),安全世界和非安全世界通过
一个名为 Monitor Mode 的模式进行转换。这里了解一下就行,针对于系统调用我们涉及不到这个。
介绍完异常级别,下面介绍一下在 ARM64 下,是如何陷入不同运行级别的:
1)  异常级别 0 使用 svc( Supervisor Call)指令陷入异常级别 1
2)  异常级别 1 使用 hvc(Hypervisor Call)指令陷入异常级别 2
3)  异常级别 2 使用 smc(Secure Monitor Call)指令陷入异常级别 3
系统调用就是运行在异常级别 0 的用户程序,通过使用 svc 指令陷入异常级别 1,来完成的陷入动作,之后
会根据异常向量表,执行异常向量服务程序。本文以 ARM64 为例来看异常向量表的配置,内核在
arch/arm64/kernel/entry.S 汇编代码中设置了异常向量表。
在介绍异常向量表之前,先介绍一下异常。在 ARM64 体系结构中,异常分为同步异常和异步异常。同步异
常是试图执行指令时生成的异常,或是作为指令的执行结果生成的异常。同步异常包括如下。
1)  系统调用。异常级别 0 使用 svc( Supervisor Call)指令陷入异常级别 1,异常级别 1 使用 hvc
(Hypervisor Call)指令陷入异常级别 2,异常级别 2 使用 smc(Secure Monitor Call)指令陷入异常级
别 3。
2)  数据中止,即访问数据时的页错误异常,虚拟地址没有映射到物理地址,或者没有写权限。
3)  指令中止,即取指令时的页错误异常,虚拟地址没有映射到物理地址,或者没有执行权限。
4)  栈指针或指令地址没有对齐。
5)  没有定义的指令。
6)  调试异常。
异步异常不是由正在执行的指令生成的,和正在执行的指令没有关联。异步异常包括以下。
1)  中断( normal priority interrupt, IRQ),即普通优先级的中断。
2)  快速中断( fast interrupt, FIQ),即高优先级的中断。

3)  系统错误( System Error, SError),是由硬件错误触发的异常,例如最常见的是把脏数据从缓存行写
回内存时触发异步的数据中止异常。

/*
* Exception vectors.
*/
.pushsection ".entry.text", "ax"
.align 11
ENTRY(vectors)
kernel_ventry 1, sync_invalid //异常级别 1 生成的同步异常,使用栈指针寄存器 SP_EL0
kernel_ventry 1, irq_invalid //异常级别 1 生成的中断,使用栈指针寄存器 SP_EL0
kernel_ventry 1, fiq_invalid //异常级别 1 生成的快速中断,使用栈指针寄存器 SP_EL0
kernel_ventry 1, error_invalid //异常级别 1 生成的系统错误,使用栈指针寄存器 SP_EL0
kernel_ventry 1, sync //异常级别 1 生成的同步异常,使用栈指针寄存器 SP_EL1
kernel_ventry 1, irq //异常级别 1 生成的中断,使用栈指针寄存器 SP_EL1
kernel_ventry 1, fiq_invalid //异常级别 1 生成的快速中断,使用栈指针寄存器 SP_EL1
kernel_ventry 1, error_invalid //异常级别 1 生成的系统错误,使用栈指针寄存器 SP_EL1
kernel_ventry 0, sync //64 位应用程序在异常级别 0 生成的同步异常
kernel_ventry 0, irq // 64 位应用程序在异常级别 0 生成的中断
kernel_ventry 0, fiq_invalid // 64 位应用程序在异常级别 0 生成的快速中断
kernel_ventry 0, error_invalid //64 位应用程序在异常级别 0 生成的系统错误
#ifdef CONFIG_COMPAT
kernel_ventry 0, sync_compat, 32 //32 位应用程序在异常级别 0 生成的同步异常
kernel_ventry 0, irq_compat, 32 // 32 位应用程序在异常级别 0 生成的中断
kernel_ventry 0, fiq_invalid_compat, 32 // 32 位应用程序在异常级别 0 生成的快速中断
kernel_ventry 0, error_invalid_compat, 32 // 32 位应用程序在异常级别 0 生成的系统错误
#else
kernel_ventry 0, sync_invalid, 32 //32 位应用程序在异常级别 0 生成的同步异常
kernel_ventry 0, irq_invalid, 32 // 32 位应用程序在异常级别 0 生成的中断
kernel_ventry 0, fiq_invalid, 32 // 32 位应用程序在异常级别 0 生成的快速中断
kernel_ventry 0, error_invalid, 32 // 32 位应用程序在异常级别 0 生成的系统错误
#endif
END(vectors)

上面的代码进一步展开,就是设置不同 mode 下的异常向量表,异常可以分为 4 组,每组异常有 4 个,所以
这里一共会设置 16 个 entry。4 组异常分别对应 4 种情况下发生异常时的处理。以下是 4 个异常向量 entry 的含
义:
1)  同步异常
2)  中断
3)  快速中断
4)  系统错误

kernel_ventry 是一个宏,参数是跳转标号,即异常处理程序的标号,宏的定义如下(/arch/arm64/kernel/entry.S):
.macro kernel_ventry, el, label, regsize = 64
.align 7
sub sp, sp, #S_FRAME_SIZE //将 sp 预留一个 fram_size, 这个 size 就是 struct pt_regs 的
大小
#ifdef CONFIG_VMAP_STACK
//....这里省略掉检查栈溢出的代码
#endif
b el\()\el\()_\label // 跳转到对应级别的异常处理函数
.endm
“ .align 7”表示把下一条指令的地址对齐到 2^7,即对齐到 128; 对于向量表 vectors 中的 kernel_entry 0, sync,
则 b el\()\el\()_\label 跳转到 el0_sync 函数。 其中 0 表示的是从哪个异常模式产生的,比如是 user->kernel 就是
0., kernel->kernel 就是 1。
实现的函数有 el1_sync,el1_irq,el0_sync,el0_irq,el1_sync_compat,el1_irq_compat 其余都是 invalid。从
异常级别 1 的异常向量表可以看出如下内容。
1)  有些异常向量的跳转标号带有“invalid”,说明内核不支持这些异常,例如内核不支持 ARM64 处
理器的快速中断。
2)  对于内核模式(异常级别 1)生成的异常, Linux 内核选择使用异常级别 1 的栈指针寄存器。
3)  对于内核模式(异常级别 1)生成的同步异常,入口是 el1_sync。
4)  如果处理器处在内核模式(异常级别 1),中断的入口是 el1_irq。
5)  对于 64 位应用程序在用户模式(异常级别 0)下生成的同步异常,入口是 el0_sync。
6)  如果处理器正在用户模式(异常级别 0)下执行 64 位应用程序,中断的入口是 el0_irq。
7)  对于 32 位应用程序在用户模式(异常级别 0)下生成的同步异常,入口是 el0_sync_compat。
8)  如果处理器正在用户模式(异常级别 0)下执行 32 位应用程序,中断的入口是 el0_irq_compat。
前面设置了异常向量表,我们来进一步查看 SVC mode 的处理。当系统调用时 CPU 会切换到 SVC mode,并
跳转到对应的地址去运行。kernel 中会配置两个 SVC Handler,分别对应这 SVC_32/SVC_64 两种 mode,32bit
程序和 64bit 程序执行系统调用会跳转到两个不同的 handler 去执行。

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

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

相关文章

k8s的二进制部署和网络类型

k8s的二进制部署 master01:192.168.233.10 kube-apiserver kube-controller-manager kube-scheduler etcd master02:192.168.233.20 kube-apiserver kube-controller-manager kube-scheduler node01:192.168.233.30 kubelet kube-proxy etc…

【数据结构】C语言实现单链表的基本操作

单链表基本操作的实现 导言一、查找操作1.1 按位查找1.1.1 按位查找的C语言实现1.1.2 按位查找的时间复杂度 1.2 按值查找1.2.1 按值查找的C语言实现1.2.2 按值查找的时间复杂度 二、插入操作2.1 后插操作2.2 前插操作 三、删除操作结语 导言 大家好,很高兴又和大家…

10 分钟了解 nextTick ,并实现简易版的 nextTick

前言 在 Vue.js 中,有一个特殊的方法 nextTick,它在 DOM 更新后执行一段代码,起到等待 DOM 绘制完成的作用。本文会详细介绍 nextTick 的原理和使用方法,并实现一个简易版的 nextTick,加深对它的理解。 一. 什么是 n…

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈

深入浅出图解C#堆与栈 C# HeapingVS Stacking第一节 理解堆与栈 [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈](https://mp.csdn.net/mdeditor/101021023)[深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理](https://mp.csdn.n…

Python 小程序之动态二位数组

动态二位数组 文章目录 动态二位数组前言一、基本内容二、代码编写三、效果展示 前言 没想出啥好点子,这次就给大家写个小程序,动态二维数组吧。 一、基本内容 程序画一个二维的方格,然后里面填上1-10的随机数,每隔一秒更新新一…

网工内推 | 网络服务工程师,HCIE认证优先,带薪年假,年终奖

01 高凌信息 招聘岗位:服务工程师(珠海) 职责描述: 1、负责华为数通(交换机、路由器)、IT(服务器、存储)等任一或多个产品领域的项目实施交付; 2、独立完成华为数通&…

【信息安全原理】——拒绝服务攻击及防御(学习笔记)

📖 前言:拒绝服务攻击(Denial of Service, DoS)是一种应用广泛、难以防范、严重威胁网络安全(破坏可用性)的攻击方式。本章主要介绍DoS的基本概念、攻击原理及防御措施。 目录 🕒 1. 定义&#…

Python面向对象高级与Python的异常、模块以及包管理

Python面向对象高级与Python的异常、模块以及包管理 一、Python中的继承 1、什么是继承 我们接下来来聊聊Python代码中的“继承”:类是用来描述现实世界中同一组事务的共有特性的抽象模型,但是类也有上下级和范围之分,比如:生物 => 动物 => 哺乳动物 => 灵长型…

【精简】解析xml文件 解决多个同名标签问题 hutool

一、测试XML报文用例 <?xml version"1.0" encoding"UTF-8"?> <TEST><PUB><TransSource>ERP</TransSource><TransCode>DsbrRpl</TransCode><TransSeq>202204081043</TransSeq><Version>1.0…

如何使用凹凸贴图和位移贴图制作逼真的模型

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 本教程将解释如何应用这些效应背后的理论。在以后的教程中&#xff0…

【C语言】初识C语言

本章节主要目的是基本了解C语言的基础知识&#xff0c;对C语言有一个大概的认识。 什么是C语言 在日常生活中&#xff0c;语言就是一种人与人之间沟通的工具&#xff0c;像汉语&#xff0c;英语&#xff0c;法语……等。而人与计算机之间交流沟通的工具则被称为计算机语言&am…

任务调度-hangfire

目录 一、Hangfire是什么&#xff1f; 二、配置服务 1.配置Hangfire服务 2.添加中间件 3.权限控制 三、配置后台任务 1.在后台中调用方法 2.调用延时方法 3.执行周期性任务 四、在客户端上配置任务 1.在AddHangfire添加UseHangfireHttpJob方法 2.创建周期任务 3.创建只读面板 总…

硅像素传感器文献调研(三)

写在前面&#xff1a; 引言&#xff1a;也是先总结前人的研究结果&#xff0c;重点论述其不足之处。 和该方向联系不大&#xff0c;但还是有值得学习的地方。逻辑很清晰&#xff0c;易读性很好。 1991年—场板半阻层 使用场板和半电阻层的高压平面器件 0.摘要 提出了一种…

低代码,前端工程化项目的未来

一、前言 在软工圣经《人月神话》一书中&#xff0c;作者Brooks指出了软件发展的一个僵局&#xff1a;在落后的项目中增加人手&#xff0c;只会使进度更加落后。 为了更快完成项目&#xff0c;开发团队会发展的极其庞大&#xff0c;以致于所有的时间都花费在沟通和变更决策上&a…

软件测试面试中90%会遇到的问题,面试前刷提高百分之60的通过率

面试的时候&#xff0c;遇到这样的提问&#xff0c;很多人的都会感觉脑子一下一片空白&#xff0c;或者星星点点&#xff0c;不知道从何说起。 一方面不知道面试官问这个问题的意图是什么&#xff1f;也不知道他想得到的答案是什么&#xff1f; 更加不知道该从哪些方面来回答…

vue3 根据用户权限控制左侧菜单和路由拦截

目录 前言 整体思路 详细开发 1.左侧菜单的显隐控制 2.控制路由权限 补充权限控制 总结 前言 我这里是vue3开发的一个后台管理系统&#xff0c;所以涉及用户权限管理&#xff0c;以及页面权限等&#xff0c;其他模块部分可以查看专栏&#xff0c;这里只对怎么实现根据用…

异步通知

文章目录 一、异步通知1、应用场景2、执行流程&#xff08;基于读取按键值的情景&#xff09;2.1、应用程序具体做什么&#xff1f;2.2、驱动程序具体做什么&#xff1f; 三、程序1、驱动程序2、测试应用程序 三、总结 一、异步通知 1、应用场景 当应用程序不想休眠时&#x…

记录一下亿级别数据入库clickhouse

需求背景 公司的业务主要是广告数据归因的&#xff0c;每天的pv数据和加粉数据粗粗算一下&#xff0c;一天几千万上亿是有的。由于数据量大&#xff0c;客户在后台查询时间跨度比较大的数据时&#xff0c;查询效率就堪忧。因而将数据聚合后导到clickhouse进行存储&#xff0c;…

数据库系统原理例题之——SQL 与关系数据库基本操作

SQL 与关系数据库基本操作 第四章 SQL 与关系数据库基本操作【例题】一 、单选题二 、填空题三 、简答题四 、设计题 【答案&解析】一、单选题二、填空题三、简答题四、设计题 【延伸知识点】【延伸知识点答案&解析】 第四章 SQL 与关系数据库基本操作 【例题】 一 、…

视频美颜SDK趋势畅想:未来发展方向与应用场景

当下&#xff0c;视频美颜SDK正不断演进&#xff0c;本文将深入探讨视频美颜SDK的发展趋势&#xff0c;探讨未来可能的方向和广泛的应用场景。 1.深度学习与视频美颜的融合 未来&#xff0c;我们可以期待看到更多基于深度学习算法的视频美颜SDK&#xff0c;为用户提供更高质量…