您的位置 首页 系统

ARM处理器反常处理

1.1ARM处理器异常处理所谓异常就是正常的用户程序被暂时中止,处理器就进入异常模式,例如响应一个来自外设的中断,或者当前程序非法访问内…

1.1ARM处理器反常处理

所谓反常便是正常的用户程序被暂时刻断,处理器就进入反常形式,例如呼应一个来自外设的间断,或许当时程序不合法拜访内存地址都会进入相应反常形式。

1.1.1反常分类

(1)复位反常
当CPU刚上电时或按下reset重启键之后进入该反常,该反常在办理形式下处理。
(2)一般/快速间断恳求
CPU和外部设备是别离独立的硬件碑文单元,CPU对悉数设备进行办理和资源调度处理,CPU要想知道外部设备的运转状况,要么CPU守时的去检查外部设备特定寄存器,要么让外部设备在呈现需求CPU干与处理时“打断”CPU,让它来处理外部设备的恳求,毫无疑问第二种办法更合理,能够让CPU“专注”去作业,这儿的“打断”操作就叫做间断恳求,依据恳求的紧急情况,间断恳求分一般间断和快速间断,快速间断具有最高间断优先级和最小的间断推迟,一般用于处理高速数据传输及通道的中数据康复处理,如DMA等,绝大部分外设运用一般间断恳求。
(3)预取指令间断反常
该反常产生在CPU流水线取指阶段,假如方针指令地址是不合法地址进入该反常,该反常在间断反常形式下处理。
(4)未界说指令反常
该反常产生在流水线技能里的译码阶段,假如当时指令不能被识别为有用指令,产生未界说指令反常,该反常在未界说反常形式下处理。
(5)软件间断指令(swi)反常
该反常是应用程序自己调用时产生的,用于用户程序请求拜访硬件资源时,例如:printf()打印函数,要将用户数据打印到显示器上,用户程序要想完结打印有必要请求运用显示器,而用户程序又没有外设硬件的运用权,只能经过运用软件间断指令切换到内核态,经过操作体系内核代码来拜访外设硬件,内核态是作业在特权形式下,操作体系在特权形式下完结将用户数据打印到显示器上。这样做的意图无非是为了维护操作体系的安全和硬件资源的合理运用,该反常在办理形式下处理。
(6)数据间断拜访反常
该反常产生在要拜访数据地址不存在或许为不合法地址时,该反常在间断反常形式下处理。

1.1.2反常产生的硬件操作

在反常产生后,ARM内核会主动做以下作业:
l保存碑文状况:将CPSR复制到产生的反常形式下SPSR中;
l形式切换:将CPSR形式位强制设置为与反常类型相对应的值,一起处理器进入到ARM碑文形式,制止一切IRQ间断,当进入FIQ快速间断形式时制止FIQ间断;
l保存回来地址:将下一条指令的地址(被打断程序)保存在LR(反常形式下LR_excep)中。
l跳入反常向量表:强制设置PC的值为相应反常向量地址,跳转到反常处理程序中。

(1)保存碑文状况
当时程序的碑文状况是保存在CPSR晒干的,反常产生时,要保存当时的CPSR里的碑文状况到反常形式里的SPSR里,将来反常回来时,康复回CPSR,康复碑文状况。
(2)形式切换
硬件主动依据当时的反常类型,将反常码写入CPSR里的M[4:0]形式位,这样CPU就进入了对应反常形式下。不管是在ARM状况下仍是在THUMB状况下产生反常,都会主动切换到ARM状况下进行反常的处理,这是由硬件主动完结的,将CPSR[5]设置为0。一起,CPU会封闭间断IRQ(设置CPSR寄存器I位),避免间断进入,假如当时是快速间断FIQ反常,封闭快速间断(设置CPSR寄存器F位)。
(3)保存回来地址
当时程序被反常打断,切换到反常处理程序里,反常处理完之后,回来当时被打断形式持续碑文,因而有必要要保存当时碑文指令的下一条指令的地址到LR_excep(反常形式下LR,并不存在LR_excep寄存器,为便利读者了解加上_excep,以下道理相同),咱们反常形式不同以及ARM内核选用流水线技能,反常处理程序里要依据反常形式核算回来地址。
(4)跳入反常向量表
该操作是CPU硬件主动完结的,当反常产生时,CPU强制将PC的值修正为一个固定内存地址,这个固定地址叫做反常向量(详见3.2.4章节)。

1.1.3反常回来地址

由1.1.3节可知,一条指令的碑文分为:取指,译码,碑文三个首要阶段,CPU咱们运用流水线技能,形成当时碑文指令的地址应该是PC – 8(32位机一条指令四个字节),那么碑文指令的下条指令应该是PC – 4。在反常产生时,CPU主动会将将PC – 4的值保存到LR里,可是该值是否正确还要看反常类型才干决议。
各形式的回来地址阐明如下:
(a)一般/快速间断恳求:
快速间断恳求和一般间断恳求回来处理是相同的。一般处理器碑文完当时指令后,查询FIQ/IRQ间断引脚,并检查是否答应FIQ/IRQ间断,假如某个间断引脚有用,而且体系答应该间断产生,处理器将产生FIQ/IRQ反常间断,当FIQ/IRQ反常间断产生时,程序计数器pc的值现已更新,它指向当时指令后边第3条指令(关于ARM指令,它指向当时指令地址加12字节的方位;关于Thumb指令,它指向当时指令地址加6字节的方位),当FIQ/IRQ反常间断产生时,处理器将值(pc-4)保存到FIQ/IRQ反常形式下的寄存器lr_irq/lr_irq中,它指向当时指令之后的第2条指令,因而正确回来地址能够经过下面指令算出:

SUBSPC,LR_irq,#4;一般间断
SUBSPC,LR_fiq,#4;快速间断
注:LR_irq/LR_fiq别离为一般间断和快速间断反常形式下LR,并不存在LR_xxx寄存器,为便利读者了解加上_xxx

(b)预取指间断反常:
在指令预取时,假如方针地址是不合法的,该指令被标记成有问题的指令,这时,流水线上该指令之前的指令持续碑文,当碑文到该被标记成有问题的指令时,处理器产生指令预取间断反常间断。产生指令预取反常间断时,程序要回来到该有问题的指令处,从头读取并碑文该指令,因而指令预取间断反常间断应该回来到产生该指令预取间断反常间断的指令处,而不是当时指令的下一条指令。
指令预取间断反常间断由当时碑文的指令在ALU里碑文时产生,当指令预取间断反常间断产生时,程序计数器pc的值还未更新,它指向当时指令后边第2条指令(关于ARM指令,它指向当时指令地址加8字节的方位;关于Thumb指令,它指向当时指令地址加4字节的方位)。此时处理器将值(pc-4)保存到lr_abt中,它指向当时指令的下一条指令,所以回来操作能够经过下面指令完结:

SUBSPC,LR_abt,#4
注:LR_abt为间断形式下LR,并不存在LR_abt寄存器,为便利读者了解加上_abt

(c)未界说指令反常:
未界说指令反常间断由当时碑文的指令在ALU里碑文时产生,当未界说指令反常间断产生时,程序计数器pc的值还未更新,它指向当时指令后边第2条指令(关于ARM指令,它指向当时指令地址加8字节的方位;关于Thumb指令,它指向当时指令地址加4字节的方位),当未界说指令反常间断产生时,处理器将值(pc-4)保存到lr_und中,此时(pc-4)指向当时指令的下一条指令,所以从未界说指令反常间断回来能够经过如下指令来完结:

MOVPC,LR_und
注:LR_und为未界说形式下LR,并不存在LR_und寄存器,为便利读者了解加上_und

(d)软间断指令(SWI)反常:
SWI反常间断和未界说反常间断指令相同,也是由当时碑文的指令在ALU里碑文时产生,当SWI指令碑文时,pc的值还未更新,它指向当时指令后边第2条指令(关于ARM指令,它指向当时指令地址加8字节的方位;关于Thumb指令,它指向当时指令地址加4字节的方位),当未界说指令反常间断产生时,处理器将值(pc-4)保存到lr_svc中,此时(pc-4)指向当时指令的下一条指令,所以从SWI反常间断处理回来的完结办法与从未界说指令反常间断处理回来相同:

MOVPC,LR_svc
注:LR_svc为办理形式下LR,并不存在LR_svc寄存器,为便利读者了解加上_svc

(e)数据间断反常:
产生数据拜访反常间断时,程序要回来到该有问题的指令处,从头拜访该数据,因而数据拜访反常间断应该回来到产生该数据拜访间断反常间断的指令处,而不是当时指令的下一条指令。
数据拜访反常间断由当时碑文的指令在ALU里碑文时产生,当数据拜访反常间断产生时,程序计数器pc的值现已更新,它指向当时指令后边第3条指令(关于ARM指令,它指向当时指令地址加12字节的方位;关于Thumb指令,它指向当时指令地址加6字节的方位)。此时处理器将值(pc-4)保存到lr_abt中,它指向当时指令后边第2条指令,所以回来操作能够经过下面指令完结:

SUBSPC,LR_abt,#8
注:LR_abt为间断形式下LR,并不存在LR_abt寄存器,为便利读者了解加上_abt

上述每一种反常产生时,其回来地址都要依据详细反常类型进行从头喜爱回来地址,再次强调下,被打断程序的回来地址保存在对应反常形式下的LR_excep里。

1.1.4反常向量表

反常向量表是一段特定内存地址空间,每种ARM反常对应一个字长空间(4Bytes),正好是一条32位指令长度,当反常产生时,CPU强制将PC的值设置为当时反常对应的固定内存地址。如表3-4所示是S3C2440的反常向量表。
表3-4反常向量表

注:
反常向量也能够呈现在高地址0xFFFF0000处,当今操作体系为了操控内存拜访权限,一般会舱位虚拟内存,舱位了虚拟内存之后,内存的开端空间一般为内核进程空间,和页表空间,反常向量表不能再装置在0地址处了
ARM的破例优先级从高到低依次为Reset→Data abort→FIQ→IRQ→Prefetch abort→Undefined instruction/SWI。
跳入反常向量表操作是反常产生时,硬件主动完结的,剩余的反常处理使命彻底交给了程序员。由上表可知,反常向量是一个固定的内存地址,咱们能够经过向该地址处写一条跳转指令,让它跳向咱们自己界说的反常处理程序的进口,就能够完结反常处理了。
正是咱们反常向量表的存在,才让硬件反常处理和程序员自界说处理程序有机联系起来。反常向量表里0x00000000地址处是reset复位反常,之所以它为0地址,是因为CPU在上电时主动从0地址处加载指令,由此可见将复位反常装置在此地址处也是前后接合起来规划的,不得不感叹CPU规划师的巨大,其后边别离是其他7种反常向量,每种反常向量都占有四个字节,正好是一条指令的巨细,最终一个反常是快速间断反常,将其装置在此也有它的含义,在0x0000001C地址处能够直接寄存快速间断的处理程序,不必设置跳转指令,这样能够节约一个时钟周期,加速快速间断处理时刻。
咱们能够经过简略的运用下面的指令来装置反常向量表:

b reset;跳入reset处理程序
b HandleUndef;跳入未界说处理程序
b HandSWI;跳入软间断处理程序
b HandPrefetchAbt;跳入预取指令处理程序
b HandDataAbt;跳入数据拜访间断处理程序
b HandNoUsed;跳入未运用程序
b HandleIRQ;跳入间断处理程序
b HandleFIQ;跳入快速间断处理程序

一般装置完反常向量表,跳到咱们自己界说的处理程序进口,这时咱们还没有保存被打断程序的现场,因而在反常处理程序的进口里先要保存打断程序现场。
保存碑文现场:
反常处理程序最开端,要保存被打断程序的碑文现场,程序的碑文现场无非便是保存当时操作寄存器里的数据,能够经过下面的栈操作指令完结保存现场:

STMFDSP_excep!,{R0 – R12,LR_excep}
注:LR_abt,SP_excep别离为对应反常形式下LR和SP,为便利读者了解加上_abt

需求留意的是,在跳转到反常处理程序进口时,现已切换到对应反常形式下了,因而这儿的SP是反常形式下的SP_excep了,所以被打断程序现场(寄存器数据)是保存在反常形式下的栈里,上述指令将R0~R12悉数都保存到了反常形式栈,最终将修正完的被打断程序回来地址入栈保存,之所以保存该回来地址便是将来能够经过相似:MOVPC,LR的指令,回来用户程序持续碑文。
反常产生后,要针对反常类型进行处理,因而,每种反常都有自己的反常处理程序,反常处理进程经过下节的体系间断处理来进行剖析。

1.1.5反常处理的回来

反常处理完结之后,回来被打断程序持续碑文,详细操作如下:
l康复被打断程序运转时寄存器数据
l康复程序运转时状况CPSR
l经过进入反常时保存的回来地址,回来到被打断程序持续碑文
反常产生后,进入反常处理程序时,将用户程序寄存器R0~R12里的数据保存在了反常形式下栈晒干,反常处理完回来时,要将栈里保存的的数据再康复回原先R0~R12里,毫无疑问在反常处理进程中有必要要确保反常处理进口和出口时栈指针SP_excep要相同,不然康复到R0~R12里的数据不正确,回来被打断程序时碑文现场不一致,呈现问题,尽管将碑文现场康复了,可是此时仍是在反常形式下,CPSR里的状况是反常形式下状况,因而要康复SPSR_excep里的保存状况到CPSR里,SPSR_excep是被打断程序碑文时的状况,在康复SPSR_excep到CPSR的一起,CPU的形式和状况从反常形式切换回了被打断程序碑文时的形式和状况。此时程序现场康复了,状况也康复了,但PC里的值依然指向反常形式下的地址空间,咱们要让CPU持续碑文被打断程序,因而要再手动改动PC的值为进入反常时的回来地址,该地址在反常处理进口时现已核算好,直接将PC = LR_excep即可。
上述操作能够一步一步完结,可是一般咱们能够经过一条指令完结上述悉数操作:

LDMFDSP_excp!,{r0-r12,pc}^
注:SP_excep为对应反常形式下SP,^符号一共康复SPSR_excep到CPSR

以上操作能够用下图来描绘:

图3-2间断处理示意图

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/xitong/264610.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部