1、ARM处理器有各种异常模式,用于应对ARM出现的不同状态。出现异常时,会随即进入相关的异常向量,同时CPSR的寄存器也会设置成具体的模式。

例:当出现中断时,不管是哪种中断,都会跳转到0x18这个总入口地址(也有可能是0xFFFFFF18,看系统初始化的虚拟地址,无所谓),然后通过中断号执行具体的中断注册函数。

同时会把CPSR寄存器设置成相应的模式。

当从一个模式切换到另一个模式的时候,需要把之前模式下的HW context保存起来,比方说从用户态进入内核态,因为新模式下,内存区域划分是不一样的。如下图,各个模式下的通用寄存器是同一份,在两种模式下,可以用来传递信息,但是像sp,lr跟空间相关的寄存器会独立一份。

2、出现异常时,如何进入异常模式

2.1、在内核启动阶段,会对异常向量表完成初始化。

start_kernelsetup_archearly_trap_init
void __init early_trap_init(void *vectors_base)
{unsigned long vectors = (unsigned long)vectors_base;extern char __stubs_start[], __stubs_end[];extern char __vectors_start[], __vectors_end[];unsigned i;vectors_page = vectors_base;....../** Copy the vectors, stubs and kuser helpers (in entry-armv.S)* into the vector page, mapped at 0xffff0000, and ensure these* are visible to the instruction stream.*/memcpy((void *)vectors, __vectors_start, __vectors_end - __vectors_start);memcpy((void *)vectors + 0x1000, __stubs_start, __stubs_end - __stubs_start);......
}

异常向量地址保存在vectors_base变量(CONFIG_VECTORS_BASE=0xffff0000)中。

异常向量地址__vectors_start在entry-armv.S - arch/arm/kernel/entry-armv.S - Linux source code (v5.16.9) - Bootlin实现初始化。

在编译的时候,地址已经确定

grep "__vectors" System.map -nR

启动的时候,可以看到异常向量的地址分布情况。

2.2、出现异常时,跳转到异常向量入口__vectors_start,不同的异常对应着不同的偏移量,从图1可以看出software interrrupt对应着异常向量第三项,即W(ldr)    pc, .L__vectors_start + 0x1000对应着software interrupt的入口。

.L__vectors_start:W(b)   vector_rstW(b)  vector_undW(ldr)    pc, .L__vectors_start + 0x1000W(b) vector_pabtW(b) vector_dabtW(b) vector_addrexcptnW(b)   vector_irqW(b)  vector_fiq.data.align   2.globl cr_alignment

后续会根据宏定义跳转到具体的异常向量处理流程。

 .macro  vector_stub, name, mode, correction=0.align    5vector_\name:.if \correctionsub    lr, lr, #\correction.endif@@ Save r0, lr_<exception> (parent PC) and spsr_<exception>@ (parent CPSR)@stmia  sp, {r0, lr}        @ save r0, lrmrs   lr, spsrstr lr, [sp, #8]        @ save spsr@@ Prepare for SVC32 mode.  IRQs remain disabled.@mrs    r0, cpsreor r0, r0, #(\mode ^ SVC_MODE | PSR_ISETSTATE)msr  spsr_cxsf, r0@@ the branch table must immediately follow this code@and   lr, lr, #0x0fTHUMB( adr r0, 1f          )THUMB( ldr lr, [r0, lr, lsl #2]    )mov    r0, spARM(  ldr lr, [pc, lr, lsl #2]    )movs   pc, lr          @ branch to handler in SVC mode
ENDPROC(vector_\name)

ARM处理器的异常模式相关推荐

  1. ARM处理器的运行模式和ARM寄存器

    一.ARM处理器共有7种运行模式  处理器模式 描述 用户模式(User,usr) 正常程序执行的模式 快速中断模式(FIQ,fiq) 用于高速数据传输和通道处理 外部中断模式(IRQ,irq) 用于 ...

  2. 关于arm处理器 内存编址模式 与 字节对齐方式 (转)

    转自:http://bavon.bokee.com/5429805.html 在x86+Linux上写的程序,在PC机上运行得很好.可是使用ARM的gcc进行交叉编译,再送到DaVinci目标板上运行 ...

  3. ARM处理器的工作模式。

  4. arm中断保护和恢复_浅谈ARM处理器的七种异常处理

    昨天的文章,我们谈了ARM处理器的七种运行模式,分别是:用户模式User(usr),系统模式System(sys),快速中断模式(fiq),管理模式Supervisor(svc),外部中断模式(irq ...

  5. ARM体系的异常中断

    在ARM体系中,通常有3种方式控制处理器的流程  1:在正常执行过程中,每执行一条ARM指令,程序计数器寄存器PC的值加四个字节,在每执行一条Thumb指令,程序计数器寄存器PC的值加两个字节,整个过 ...

  6. 计算机原理与应用 第二章——ARM处理器

    第二章--ARM微处理器 文章目录 第二章--ARM微处理器 一.ARM微处理器特点及功能结构 1.ARM微处理器主要特点 2.指令集方面的主要特点 3.Cortex系列处理器特点 4.ARM处理器功 ...

  7. ARM处理器中断处理机制

    一.异常   概念:处理器在正常执行程序的过程中可能会遇到一些不正常的事件发生,这时处理器就要将当前的程序暂停下来去处理这个异常的事件,当异常事件处理完成之后再返回被异常打断的点继续执行程序. 不同的 ...

  8. ARM处理器工作模式

    一.ARM体系的CPU有以下7种工作模式: 1.用户模式(usr):正常的程序执行状态 2.快速中断模式(fiq):用于支持高速数据传输或通道处理 3.中断模式(irq):用于普通中断处理 4.管理模 ...

  9. [ARM] ARM处理器的7种工作模式和2种工作状态

    转载:https://blog.csdn.net/ly930156123/article/details/79219303 两种工作状态 1.ARM状态:32位,ARM状态执行字对齐的32位ARM指令 ...

最新文章

  1. 《C++ Primer》 Part V (Advanced Topics)
  2. async function_理解 Iterator, Generator 和 Async/Await
  3. 爬虫 spider07——爬取腾讯娱乐新闻
  4. Android LinearLayout
  5. RecyclerView多布局的简单使用
  6. HDFS文件导出本地合并为一个文件
  7. 新冠患者样本单细胞测序文献汇总
  8. 计算机数值模拟仿真技术的优点,板料成形的计算机数值模拟仿真技术.pdf
  9. discuz 不能上传头像提示can not write to the data/tmp folder
  10. 一个基于typescript、mobx、react16、react-router4、antd的后台模板
  11. Java-NIO实战多人聊天室
  12. 手机背景图片在安卓手机上不显示
  13. 明解c语言练习答案,《明解C语言》练习题4-2的实现
  14. android pin码解锁,解锁三星的3种方法:SIM网络解锁PIN码
  15. Chrome谷歌浏览器无需插件设置夜间模式,黑色主题
  16. js树形数据处理--树形数据转换,获取指定类型节点下的所有子节点或指定类型下的所有父节点
  17. iPhone导出网易云音乐本地音乐
  18. GPRS远程开关 1 综述
  19. 极限中0除以常数_第六讲 极限的运算法则
  20. TFTP服务器与客户端的安装

热门文章

  1. 思辨与创新 第一章 提出问题:如何提出一个新的、好的问题?
  2. Android 24点游戏 程序 源码
  3. R语言多项逻辑回归-因变量是无序多分类
  4. FileZilla 使用方法
  5. EVM 挣值管理-高项笔记5
  6. 给定一个正整数a,以及另外的5个正整数,问题是:这5个整数中,小于a的整数的和是多少?
  7. html5新特性表单控件,老生常谈h5新特性1:(表单)
  8. 数据库中表的常见七大约束
  9. 热电阻 热电偶 测量电路_每日一练#运放在热电阻测量电路中的应用
  10. dmidecode查看硬件信息