ARM异常中断机制.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ARM9(以S3C2410为例)中断机制
一、ARM异常机制介绍
ARM9处理器有7种工作模式。分别是(除了用户模式其他都是异常模式
用户模式(usr:ARM处理器正常的程序执行状态。
快速中断模式(fiq:用于高速数据传输或通道处理。
外部中断模式(irq:用于通用的中断处理。
管理模式(svc:操作系统使用的保护模式。
数据访问终止模式(abt:当数据或指令预取终止时进入该模式。
系统模式(sys:运行具有特权的操作系统任务。
未定义指令中止模式(und:当未定义的指令执行时进入该模式。
每种模式通过5位二进制编码进行标示:
用户模式10000
快速中断模式10001
外部中断模式10010
管理模式10011
数据访问终止模式10111
未定义指令中止模式11011
系统模式11111
模式编码存放在CPSR(程序当前状态寄存器,记录当前工作模式的编码的值)中的[4:0]。
快速中断模式、外部中断模式、数据访问终止模式、未定义指令中止模式、管理模式称为异常模式。
异常类型具体含义
复位当处理器的复位电平有效时,产生复位异常,程序跳转到复位异常处理程序处执行。
未定义指令遇到不能处理的指令时,产生未定义指令异常。
软件中断该异常由执行SWI指令产生,可用于用户模式下的程序调用特权操作指令。可使用该异常机制实现系统功能调用。
指令预取中止若处理器预取指令的地址不存在,或该地址不允许当前指令访问,存储器会向处理器发出中止信号,但当预取的指令被执行时,才会产生指令预取中止异常。
数据中止若处理器数据访问指令的地址不存在,或该地址不允许当前指令访问时,产生数据中止异常。
IRQ(外部中断请求)当处理器的外部中断请求引脚有效,且CPSR中的I 位为0时,产生IRQ异常。系统的外设可通过该异常请求中断服务。
FIQ(快速中断请求)当处理器的快速中断请求引脚有效,且CPSR中的F 位为0时,产生FIQ异常。
当多个异常发生时,处理器根据优先级进行处理。优先级
1(最高)复位
2 数据中止
3 FIQ
4 IRQ
5 预取指令中止
6(最低)未定义指令、SWI
异常中断发生时,处理器执行完当前的指令,需要保存当前执行现场,切换到相应的异常模式,并跳转到相应的异常中断处理程序。中断处理完成后,处理器返回现场执行下条指令。
异常处理一般过程如下:
(1)把当前工作模式中的下一条即将运行的指令地址保存到R14中;
(2)保存当前CPSR到SPSR(保存程序状态寄存器);
(3)改写CPSR中的工作模式为当前产生异常的工作模式;
(4)禁止IRQ(如果进入FIQ则禁止FIQ);
(5)跳转到相应异常向量表入口;
如果是复位异常处理会禁止所有中断,另外由于不用返回,因此不需要作(1)(2)步。以上的异常处理操作都是由处理器自动完成的。
二、异常向量表
Linux内核启动时,向量表的创建过程为:init/main.c->start_kernel(->trap_init(。trap_init函数位于/arch/$(ARCH/kernel/traps.c中。trap_init函数中向量表创建的相关代码如下:
unsigned long vectors = CONFIG_VECTORS_BASE;
……
memcpy((void *vectors, __vectors_start, __vectors_end - __vectors_start;
memcpy((void *vectors + 0x200, __stubs_start, __stubs_end - __stubs_start;
其中CONFIG_VECTORS_BASE是向量表的基地址。在ARM V4及V4T以后的大部分处理器中,向量表可以有两个位置:一个是0,另一个是0xffff0000。通过CP15协处理器c1寄存器中V位(bit[13]控制。V和异常向量表的对应关系如下:
V=0 ~ 0x00000000~0x0000001C
V=1 ~ 0xffff0000~0xffff001C
CONFIG_VECTORS_BASE的值在内核的相关配置文件中定义。比如在
/arch/arm/configs/s3c2410_defconfig中CONFIG_VECTORS_BASE=0xffff0000。
异常向量表存放在__vectors_start至__vectors_end定义的空间内。
异常向量表的逻辑结构(8*4个字节)为:
异常类型工作模式地址
复位管理模式0x00000000
未定义指令未定义指令中止模式0x00000004
软件中断管理模式0x00000008
数据访问终止模式0x0000000C
中止(预取指
令)
中止(数据)数据访问终止模式0x00000010
保留0x00000014
IRQ 外部中断模式0x00000018
FIQ 快速中断模式0x0000001C
异常向量表的物理结构位于arch/arm/kernel/entry-armv.S中,如下所示:
.globl __vectors_start
__vectors_start:
swi SYS_ERROR0:
b vector_und + stubs_offset //复位异常:
ldr pc, .LCvswi + stubs_offset //未定义指令异常:
b vector_pabt + stubs_offset //软件中断异常:
b vector_dabt + stubs_offset //数据异常(预取指令中止、数据中止):
b vector_addrexcptn + stubs_offset //保留:
b vector_irq + stubs_offset //普通中断异常:
b vector_fiq + stubs_offset //快速中断异常:
.globl __vectors_end:
__vectors_end:
异常向量表中各种异常对应位置上放置了一条跳转指令,用于指向相应异常的处理程序。__stubs_start至__stubs_end之间是异常处理程序的位置。
stubs_offset的值为:
.equ stubs_offset, __vectors_start + 0x200 - __stubs_start
三、中断处理