3.ARMv8 中断及异常处理(包括系统调用,系统调用即同步异常)

来源:互联网 发布:windows 8.1系统镜像 编辑:程序博客网 时间:2024/05/17 04:59

ARMv8 64bits相对于之前的 32bits 有较大变动,所有中断及异常的处理总入口都在entry.S 源文件中。

1.1.       异常介绍(中断即称为 异步异常)

分为同步和异步 两种类型异常,中断划入异步异常类型:

Synchronous(同步异常)

异常类型

描述

Undefined Instruction

未定义指令异常

Illegal Execution State

非常执行状态异常

System Call

系统调用指令异常(SVC/HVC/SMC)

Misaligned PC/SP

PC/SP未对齐异常

Instruction Abort

指令终止异常

Data Abort

数据终止异常

Debug exception

软件断点指令/断点/观察点/向量捕获/软件单步 等Debug异常

 

Asynchronous(异步异常)

类型

描述

SError or vSError

系统错误类型,包括外部数据终止

IRQ or vIRQ

外部中断 or 虚拟外部中断

FIQ or vFIQ

快速中断 or 虚拟快速中断

1.2.       异常处理逻辑

跳转到哪个EL使用哪个向量偏移地址又路由关系决定。路由关系看的比较晕,需要对体系架构有一定了解,

 

 

 

 

异常进入满足以下条件

向量地址偏移表

Synchronous

(同步异常)

IRQ

|| vIRQ

FIQ

|| vFIQ

SError

|| vSError

SP => SP_EL0

&& 从Current EL

0x000

0x080

0x100

0x180

SP => SP_ELx

&& 从Current EL

0x200

0x280

0x300

0x380

64bit => 64bit

&& 从Low level EL

0x400

0x480

0x500

0x580

32bit => 64bit

&& 从Low level EL

0x600

0x680

0x700

0x780

• SP=> SP_EL0,表示使用SP_EL0堆栈指针,由PSTATE.SP== 0决定,PSTATE.SP == 1 则SP_ELx;

• 32bit=> 64bit 是指发生异常时PE从AArch32切换到AArch64的情况;

 

exception level迁移情况

Synchronous exceptionoffset

IRQvIRQ exceptionoffset

FIQvFIQ exceptionoffset

SErrorvSError exceptionoffset

同级exception level迁移,使用SP_EL0。例如EL1迁移到EL1

0x000

0x080

0x100

0x180

同级exception level迁移,使用SP_ELx。例如EL1迁移到EL1

0x200

0x280

0x300

0x380

ELx迁移到ELy,其中y>x并且ELx处于AArch64状态

0x400

0x480

0x500

0x580

ELx迁移到ELy,其中y>x并且ELx处于AArch32状态

0x600

0x680

0x700

0x780

1.3.       代码实现,参考entry.S

 

带invalid后缀的向量都是linux做未做进一步处理的向量,默认都会进入bad_mode()流程,说明这类异常Linux内核无法处理,只能上报给用户进程(用户态,sigkill或sigbus信号)或die(内核态)。

el0_sync:在用户态发生同步异常处理

el0_irq:在用户态发生irq中断处理

el1_sync:在内核态发生同步异常处理

el1_irq:在内核态发生irq中断处理

 

对于异步异常sError,当前都是不会进一步做处理,直接进入inalid处理逻辑。

 

1.4.       参考资料

ARMv8架构与指令集.学习笔记:http://blog.csdn.net/forever_2015/article/details/50285865第5章 异常模型

ARMv8 Linux内核异常处理过程分析http://blog.csdn.net/qianlong4526888/article/details/11347659

Arm64中的异常处理:http://blog.csdn.net/omnispace/article/details/51038805

ARM64的启动过程之(六):异常向量表的设定http://blog.csdn.net/zdy0_2004/article/details/50018877

 

 

 

 

 

 

原创粉丝点击