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

Cortex-A核的异常的处理过程

1、Cortex-A核的处理器工作模式

Monitor Mode : 安全监控模式,主要运行安全相关的代码。

PHY_mode : 超级管理模式,主要是用于虚拟化技术的支持。

2、ARM处理器的异常

中断属于异常中的一种。导致处理器从用户模式切换到异常模式的事件通常异常源。

异常模式异常源备注
FIQ异常模式FIQ类型的异常源FIQ类型的异常源指的是一类,不是某一个。
IRQ异常模式IRQ类型的异常源IRQ类型的异常源指的是一类,比如按键中断,定时器中断,串口中断,....
SVC模式Reset信号系统发送复位时,复位按键,看门狗复位,上电复位。
软中断指令(swi)swi 软中端号, 软中断号的范围为0 ~ (2^24-1)
Abort模式data Abort类型异常源取数据发送异常,
Prefetch Abort类型异常源取指令发送异常。
Undef模式undef类型异常源译码器翻译指令时,无法解析指令,则是未定义的异常

总结:5种异常模式对应着7中异常源,异常源具有优先级,复位的优先级是最高。

3、异常的处理过程

当发生异常时,程序切换到异常处理程序中执行,分析异常的处理过程。

 

4、swi软中断指令

start.s文件:

@ 启动文件
.text      
.global _start  

_start: 
	@ 1. 构建异常向量表
	b reset
	b undef_handler
	b swi_handler
	b pref_handler
	b data_handler
	b .
	b irq_handler
	b fiq_handler

@ 异常处理程序的入口函数
reset: 
	@ 2. 初始化SVC模式下的栈指针,
	ldr sp, =0x40000800
	
	@ 3. 从svc模式切换到user模式
	mrs r0, cpsr
	bic r0, r0, #0x1F
	orr r0, r0, #0x10
	msr cpsr, r0
	
	@ 4. 初始化user模式下的栈指针
	ldr sp, =0x40000700
	
	mov r0, #0x3
	mov r1, #0x4
	
	@ 软中断指令
	@ 执行软中断指令,CPU自动完成4大步3小步保存现场,
	/*
		1. 保存cpsr到spsr_<mode>
		2. 修改cpsr
			2.1 切换到ARM状态
			2.2 禁止中断位,根据需要
			2.3 修改模式位,切换到对应的异常模式
		3. 保存返回地址到LR_<mode>
		4. 修改PC值执行异常向量表中
	*/
	swi 2
	
	add r2, r0, r1  @ r2 = r0 + r1 = 0x7
	nop
	nop
	b stop


undef_handler:
@ 软中断的异常处理程序
swi_handler:
	stmfd sp!, {r0-r1, lr}   @ 压栈保存现场
	mov r0, #9
	mov r1, #15
	@ 将lr中的值恢复给PC
	@ ^ : 恢复spsr_<mode>到cpsr中
	ldmfd sp!, {r0-r1, pc}^   @ 出栈恢复现场
	
pref_handler:
data_handler:
irq_handler:
fiq_handler:

	
	stop: 
		b stop  
.end   
	
@ 启动文件
.text      
.global _start  

_start: 
	@ 1. 构建异常向量表
	b reset
	ldr pc, __undef_handler
	ldr pc, __swi_handler
	ldr pc, __pref_handler
	ldr pc, __data_handler
	b .
	ldr pc, __irq_handler
	ldr pc, __fiq_handler

@ .word : 申请4字节的空间存放一个32位的数据
/* __undef_handler指针变量名,申请4字节空间,
	存undef_handler函数的入口地址 */
__undef_handler:
	.word undef_handler
__swi_handler:
	.word swi_handler
__pref_handler:
	.word pref_handler
__data_handler:
	.word data_handler
__irq_handler:
	.word irq_handler
__fiq_handler:
	.word fiq_handler
		
		
@ 异常处理程序的入口函数
reset: 
	@ 2. 初始化SVC模式下的栈指针,
	ldr sp, =0x40000800
	
	@ 3. 从svc模式切换到user模式
	mrs r0, cpsr
	bic r0, r0, #0x1F
	orr r0, r0, #0x10
	msr cpsr, r0
	
	@ 4. 初始化user模式下的栈指针
	ldr sp, =0x40000700
	
	mov r0, #0x3
	mov r1, #0x4
	
	@ 软中断指令
	@ 执行软中断指令,CPU自动完成4大步3小步保存现场,
	/*
		1. 保存cpsr到spsr_<mode>
		2. 修改cpsr
			2.1 切换到ARM状态
			2.2 禁止中断位,根据需要
			2.3 修改模式位,切换到对应的异常模式
		3. 保存返回地址到LR_<mode>
		4. 修改PC值执行异常向量表中
	*/
	swi 2
	
	add r2, r0, r1  @ r2 = r0 + r1 = 0x7
	nop
	nop
	b stop


undef_handler:
@ 软中断的异常处理程序
swi_handler:
	stmfd sp!, {r0-r1, lr}   @ 压栈保存现场
	mov r0, #9
	mov r1, #15
	@ 将lr中的值恢复给PC
	@ ^ : 恢复spsr_<mode>到cpsr中
	ldmfd sp!, {r0-r1, pc}^   @ 出栈恢复现场
	
pref_handler:
data_handler:
irq_handler:
fiq_handler:

	
	stop: 
		b stop  
.end   

@ 启动文件
.text      
.global _start  

_start: 
	@ 1. 构建异常向量表
	b reset
	ldr pc, __undef_handler
	ldr pc, __swi_handler
	ldr pc, __pref_handler
	ldr pc, __data_handler
	b .
	ldr pc, __irq_handler
	ldr pc, __fiq_handler

@ .word : 申请4字节的空间存放一个32位的数据
/* __undef_handler指针变量名,申请4字节空间,
	存undef_handler函数的入口地址 */
__undef_handler:
	.word undef_handler
__swi_handler:
	.word swi_handler
__pref_handler:
	.word pref_handler
__data_handler:
	.word data_handler
__irq_handler:
	.word irq_handler
__fiq_handler:
	.word fiq_handler
		
		
@ 异常处理程序的入口函数
reset: 
	@ 2. 初始化SVC模式下的栈指针,
	ldr sp, =0x40000800
	
	@ 3. 从svc模式切换到user模式
	mrs r0, cpsr
	bic r0, r0, #0x1F
	orr r0, r0, #0x10
	msr cpsr, r0
	
	@ 4. 初始化user模式下的栈指针
	ldr sp, =0x40000700
	
	mov r0, #0x3
	mov r1, #0x4
	
	@ 软中断指令
	@ 执行软中断指令,CPU自动完成4大步3小步保存现场,
	/*
		1. 保存cpsr到spsr_<mode>
		2. 修改cpsr
			2.1 切换到ARM状态
			2.2 禁止中断位,根据需要
			2.3 修改模式位,切换到对应的异常模式
		3. 保存返回地址到LR_<mode>
		4. 修改PC值执行异常向量表中
	*/
	swi 2
	swi 3
	swi 4
	
	add r2, r0, r1  @ r2 = r0 + r1 = 0x7
	nop
	nop
	b stop


undef_handler:
@ 软中断的异常处理程序
swi_handler:
	stmfd sp!, {r0-r1, lr}   @ 压栈保存现场
	@ 获取软中断号
	sub r3, lr, #4
	ldr r4, [r3]
	bic r4, r4, #0xFF000000
	
	cmp r4, #2
	moveq r0, #9
	cmp r4, #3
	moveq r1, #15
	cmp r4, #4 
	moveq r0, #6
	moveq r1, #12
	
	@ 将lr中的值恢复给PC
	@ ^ : 恢复spsr_<mode>到cpsr中
	ldmfd sp!, {r0-r1, pc}^   @ 出栈恢复现场
	
pref_handler:
data_handler:
irq_handler:
fiq_handler:

	
	stop: 
		b stop  
.end   
	

相关文章:

  • 基于IDEA 工程项目的git实操
  • SAP 多个smartforms同时打印页码问题
  • 离线数仓搭建_03_Hadoop的配置与优化测试
  • 【设计模式】Java设计模式 - 命令模式
  • openstack-mitaka(二) 基于vmware的搭建
  • 【Vue2】VantUI项目入门教程
  • 痛苦与反思:想提升自己,却不知道该如何做
  • C++和QML混合编程_C++端后台多线程处理
  • Math 对象+JS数组求和的常用方法+ indexOf+js计算数组中每个元素出现的次数+while循环语句死循环
  • 用ARM进行汇编语言编程(7)HelloWorld和gdb调试Arm程序
  • 【Vue 基础知识】控制元素显示隐藏的方法和区别
  • 终于拿到了爆火全网的进一线大厂程序员必看的1700道java面试题
  • Redis事务操作与原理剖析
  • 北京十大靠谱律师事务所排名(口碑榜单)
  • Linux基础 常见问题-添加桌面快捷方式链接shell脚本
  • 【译】JS基础算法脚本:字符串结尾
  • 时间复杂度分析经典问题——最大子序列和
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • Cookie 在前端中的实践
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • IDEA常用插件整理
  • JavaScript 一些 DOM 的知识点
  • Otto开发初探——微服务依赖管理新利器
  • Puppeteer:浏览器控制器
  • redis学习笔记(三):列表、集合、有序集合
  • SAP云平台里Global Account和Sub Account的关系
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • vue学习系列(二)vue-cli
  • yii2权限控制rbac之rule详细讲解
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 工程优化暨babel升级小记
  • 收藏好这篇,别再只说“数据劫持”了
  • 微信小程序设置上一页数据
  • 项目管理碎碎念系列之一:干系人管理
  • 一个JAVA程序员成长之路分享
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​卜东波研究员:高观点下的少儿计算思维
  • # Apache SeaTunnel 究竟是什么?
  • # 飞书APP集成平台-数字化落地
  • (¥1011)-(一千零一拾一元整)输出
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (13)Hive调优——动态分区导致的小文件问题
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (26)4.7 字符函数和字符串函数
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (C++20) consteval立即函数
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (六)软件测试分工
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (一)WLAN定义和基本架构转
  • (转) Face-Resources
  • (转)h264中avc和flv数据的解析
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)