ARM异常之常见关注点梳理


异常处理流程

当异常发生时,处理器有一套预定义好的处理序列来处理异常及从异常中恢复。如果发生异常,除了reset之外,其他异常都会执行完当前正在执行的那条指令,在进入异常处理流程。下列的处理流程都是自动进行的:

  • CPSR被复制到SPSR_<mode>,模式就是异常要进入的模式(比如FIQ,IRQ等),各个具体模式见下图。
  • 处理器切换到对应的异常模式,并设置CPSR中相关的位,比如模式位。同时在所有异常模式下IRQ中断都将被自动禁止,而FIQ中断只有进入FIQ中断/reset模式时才会被禁止。
  • 切换到ARM状态(如果当前是thumb状态的话)
  • 把PC值存储到 LR_<mode>,模式就是当前进入的异常模式
  • PC强制设置为对应异常的向量入口地址。


    image.png

备注:上面所有这些操作都是异常发生时,ARM处理器硬件自动完成的,无需写任何一行代码。

上面自动处理完之后,处理器就会开始执行当前的异常处理程序(exception handler),异常处理程序是一块用来处理特定异常发生时的程序(当然不同异常,有不同的处理程序)。

异常处理程序执行完之后将回到主程序。要么是回到触发异常的那条指令继续执行,要么是回到触发异常指令之后的那条指令继续执行,具体视不同的异常模式而定。但有两件事,必须通过软件方式来完成:

  • 之前存储的SPSR_<mode>必须恢复到CPSR
  • 之前存储的LR_<mode>必须恢复到PC

当然这种操作只能在ARM状态下运行,而且通常在异常处理程序末端只需一条指令就可以完成这两件事。

  • 比如执行类似如下指令:LDMFD sp!, {r0-r12, pc}^,这是一条比较有意思指令,它做了两件事情,除了字面上看到的从栈中恢复r0-r12,并且把LR_<mode>恢复到PC。同时指令语句最后的符号 (^)也表示把SPSR_<mode>恢复到CPSR。也是推荐的退出异常处理模式方式。
  • 当然如果不需要出栈的操作,用专用的异常还回指令 (即目的寄存器是PC并且操作码后面加S)比如MOVS pc, lr也可以一条指令同时实现把LR_<mode>恢复到PC,把SPSR_<mode>恢复到CPSR。

备注:大多数的ARM处理器核都具有类似异常处理流程,但也会有一些差异,具体可以参考各个版本的技术参考手册。


异常向量表

如下图所示,一般来说从0x00000000开始到0x0000001C这一段地址是预留给异常向量表的, 每个异常向量在内存中都有固定地址(当然有的处理器可以选择把向量表放到高位地址)。


image.png

如上图所示,每个异常向量入口地址只能存储一条32位的指令,这条指令需要改变当前PC内容来跳转到真正的异常处理程序的地址(FIQ处理程序可以直接在向量入口地址执行,因为之后没有其他向量了,不会造成覆盖其他向量内容)。通常有下面三种方式来改变PC内容:

  • 通过分支指令B。通过分支指令可以直接跳转到异常处理程序的地址,使用该方式最大能跳转的范围是32M,因此如果跳转超过32M的范围,就需要使用其他方式。
  • 使用MOV指令。当然使用该方式也是有限制的,可以参考我之前的文章 ARM汇编中立即数的加载
    e.g. MOV PC, #0xEF000000
  • 使用LDR指令。e.g. LDR PC, [PC + offset]

下图是参考资料中异常向量入口所映射跳转到异常处理程序的一个例子。


image.png

异常处理程序

异常处理程序(除了reset)通常都需要做现场保护、恢复工作。这里的现场指的是进入异常之前的处理器相关的一些状态,寄存器资源等(包括通用寄存器及特定寄存器)。当然有些处理器已经帮你自动进行保存了,这部分不需要进行保存。一个原则是你在这一块异常处理程序块中会破坏哪些资源,你就需要去保护哪些资源。通常现场保护是进行入栈操作。现场恢复就是,就是让处理器恢复到进入异常之前状态继续运行(就像没有发生过异常一样),与之对应的是出栈操作去恢复寄存器资源的数据,处理器的状态等。

reset异常处理

这里主要讲从软件角度来看要处理哪些事情(至于硬件处理过程可以参考ARM处理器的Programmers’ Model。即PC指到 0x00000000地址,并开始处理第一条指令,通常这是一个跳转指令,会跳转到真正的reset异常处理程序去执行。一般需要处理如下事情:

  • 建立异常向量表
  • 初始化内存系统(如MMU/MPU)
  • 初始化所以要用到的处理器模式的堆栈,及寄存器等。
  • 初始化关键I/O设备,外设寄存器,控制寄存器,时钟
  • 使能中断
  • 改变处理器模式/状态等。
  • 跳转到主程序

备注:reset异常处理程序,并没有还回机制,最后一条指令执行完,跳转到主程序执行。

中断异常

ARM中断有2种,FIQ、IRQ。FIQ是中断里面速度最快,优先级最高的。高优先级的具体表现形式是:当同时发生中断时,FIQ最先被处理,同时禁止IRQ中断,只有FIQ退出时,IRQ才有机会被服务。

软中断异常

软中断是通过调用软中断指令SVC故意去触发的,而不是随机触发的,通过调用SVC指令来使处理器强制进入特权的Supervisor模式。SVC的语法格式如下:
SVC{cond} #imm
imm的取值范围:

  • A32:0 ~2的24次方-1
  • T32:0-255

imm其实对处理器来说没什么意义,但是它可以作为一个输入参数提供给软中断异常处理程序。软中断异常处理程序可以根据这个imm来判断是什么服务请求(这个程序设计者可以自己定义)。

软中断异常处理程序要获取这个imm值还是有点小麻烦(现在的ARM处理器机制,没法把imm直接传递给软中断异常处理程序),软中断异常处理程序需要自己定位到调用SVC指令的地址,并从中扣出imm值在来使用。具体步骤如下:

  • 软中断异常处理程序需要通过SPSR中的T位来确认进入异常状态前的处理器是处于ARM还是Thumb状态
  • 定位SVC指令。如果是之前是ARM状态则SVC指令位置在 <LR-4>,如果是Thumb状态则为 <LR-2>
  • 取出SVC指令中的imm值,并通过该值来决定要调用哪个服务。

异常优先级

异常优先级是用来处理多个不同类型的异常同时发生时,谁该优先进行处理的排序。这个可以参考ARM处理器的Programmers’ Model


参考资料

【1】ARM Assembly Language_ Fundamentals and Techniques (2nd ed.)
【2】ARM嵌入式系统开发:软件设计与优化
【3】DUI0801I_armasm_user_guide
【4】ARM_SoC体系结构

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • 1.ARM中一些常见英文缩写解释 MSB:最高有效位; LSB:最低有效位; AHB:先进的高性能总线; VPB:...
    Leon_Geo阅读 635评论 0 4
  • 5.1.1 Linux 异常处理的层次结构 异常的作用异常,就是可以打断CPU正常运行流程的一些事情,如外部中断、...
    _Ke_阅读 2,466评论 0 3
  • 2018年7月14日,第二十一届世界杯季军赛,比利时对决英格兰。追了半个赛季(只看十点场)的球赛,现在看着比赛,打...
    六月一页书阅读 366评论 0 1
  • 忐忑又激动,星星之火,灭掉也疼…
    Ada_YYYYYY阅读 66评论 0 0
  • 口腔颌面部囊肿 口腔颌面部囊肿较多见,常见的软组织囊肿有唾液腺囊肿,皮肤腺囊肿,皮样囊肿。 软组织囊肿有以下分类;...
    大兵小将2016阅读 1,651评论 0 0