ARM中断向量表与响应流程Word下载.docx
- 文档编号:7297124
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:14
- 大小:86.80KB
ARM中断向量表与响应流程Word下载.docx
《ARM中断向量表与响应流程Word下载.docx》由会员分享,可在线阅读,更多相关《ARM中断向量表与响应流程Word下载.docx(14页珍藏版)》请在冰点文库上搜索。
vector_dabt+stubs_offset
vector_addrexcptn+stubs_offset
vector_irq+stubs_offset
vector_fiq+stubs_offset
ARM的异常处理向量表在entry-armv.S文件中:
1.2中断向量表类型
FromARM
定义异常(地址逻辑自上而下0x00----0x1c)跟具体的cpu特性有关
ARM(
SYS_ERROR0
)向量0:
reset,但是这里被修改了,如果是cpu跑到了0地址,用软件中断SYS_ERROR0来处理.
THUMB(
svc
#0
)向量1
nop
)向量2
W(b)
vector_und+stubs_offset
向量3#未定义指令异常
W(ldr)
pc,.LCvswi+stubs_offset
向量4#软中断
vector_pabt+stubs_offset
#向量5指令预取异常中断(PrefetchAbort)
vector_dabt+stubs_offset
#向量6数据中止
vector_addrexcptn+stubs_offset
#向量7地址异常Thesearen'
ttoocritical.
vector_irq+stubs_offset
#向量8.IRQ(一般中断)
vector_fiq+stubs_offset
#向量9
FIQ(快速中断)
/*关于.globl指令:
.global/.globl命令
.globalsymbol
.global使得连接程序(ld)能够识别symbl
声明symbol是全局可见的。
标号_start是GNU链接器用来指定第一个要执行指令所必须的,同样的是全局可见的(并且只能出现在一个模块中)
例如:
.global_start
#定义_start为外部程序可以访问的标签
__vectors_start符号,又存放在哪里呢?
有不同的方式,可以指定加载的ram地址,如\kernel\arch\c6x\kernel平台
SECTIONS
{
/*
*Startkernelreadonlysegment
*/
READONLY_SEGMENT_START
.vectors:
_vectors_start=.;
*(.vectors)
.=ALIGN(0x400);
_vectors_end=.;
}
指定好了vector在内核镜像加载到内存后的地址0x400;
但是arm就不指定,如下,在启动之后存放的地址:
//中断服务处理程序
c000b500T__kuser_helper_start
c000b500t__kuser_memory_barrier
c000b520t__kuser_cmpxchg
c000b540t__kuser_get_tls
c000b55ct__kuser_helper_version
c000b560T__kuser_helper_end
c000b560T__stubs_start
//中断服务处理程序
c000b560tvector_irq
c000b5e0tvector_dabt
c000b660tvector_pabt
c000b6e0tvector_und
c000b760tvector_fiq
c000b764tvector_addrexcptn
c000b784T__stubs_end
c000b784T__vectors_start中断向量表的起始地址32字节
c000b7a4T__vectors_end
2.其次
向量表在系统bootup的时候被链接在哪里?
/out/target/product/huaqin82_cwet_kk/obj/KERNEL_OBJ/arch/arm/kernel/entry-armv.o
打包成build-in.o
3,最后内核建立向量表vector的拷贝
__trap_init函数填充后的向量表如下:
虚拟地址
异常
处理汇编代码
0xffff0000
resetswi
SYS_ERROR0
0xffff0004
undefined
b__real_stubs_start+(vector_undefinstr-__stubs_start)
0xffff0008
软件中断
ldrpc,__real_stubs_start+(.LCvswi-__stubs_start)
0xffff000c
取指令异常
b__real_stubs_start+(vector_prefetch-__stubs_start)
0xffff0010
数据异常
b__real_stubs_start+(vector_data-__stubs_start)
0xffff0014
reserved
b__real_stubs_start+(vector_addrexcptn-__stubs_start)
0xffff0018
irq
b__real_stubs_start+(vector_IRQ-__stubs_start)
0xffff001c
Fiq
b__real_stubs_start+(vector_FIQ-__stubs_start)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
中断向量表与中断服务程序
总的来说对于中断向量表的定义和存放(加载)和处理流程如下:
首先理解相关概念:
中断控制器
负责
(1)屏蔽和过滤中断信号
(2)唤醒cpu。
分为向量中断模式和非向量中断模式:
---向量中断模式用于RESET、NMI、异常处理。
当向量中断产生时,控制器直接将PC赋值,如IRQ异常跳到0x0000000d处,而在0x0000000d地址处通常放置ISR服务程序地址LDRPC,=ISR_HANDLER。
---非向量中断模式,有一个寄存器标识位,跳转到统一的函数地址,此函数通过判别寄存器标识位和优先级关系进行中断-处理。
跳转指令:
我分为两种:
1是中断控制器的跳转指令(实际上编译好的机器码):
为何需要?
因为当cpu在中断发生的时候,cpu如何知道把pc指针执行哪里去执行指令呢。
所以通过中断控制器的跳转指令帮助把cpu的执行指针pc,执行相应的中断向量表。
2是cpu相关的跳转指令,如arm处理器:
bbl,ldr等:
完成跳转到不同的中断服务处理程序。
1)中断服务程序
定义在哪里?
如arm的dataabort异常处理程序:
首先跳转指令:
vector_dabt+stubs_offset
---->
这个地址的指令定义也在entry-armv.S:
vector_stub
dabt,ABT_MODE,8
----》__dabt_svc(内核模式发生dataabort)或者__dabt_usr(用户模式发生dataabort)
-----》dabt_helper是一个宏--->
bl
CPU_DABORT_HANDLER
2)存放(加载)的地址?
中断向量表定义好了之后,存放了ram的哪里呢?
也就是__vectors_start存在内存什么地址?
答案:
可以定在你需要的任何可访问ram地址(这里指的虚拟地址,不是物理ram地址)。
例子1:
单片机
非向量中断模式
假定非向量中断表定义在0x00400000开始的外部RAM空间:
引用网络图2
中断解析示例流程
图2中实线表示的流程都用ARM汇编语言编写,一般作为boot代码的一部分放在系统的底层模块中。
填写向量表的操作可以在上层应用程序中方便地实现,比如在C语言中:
*(int*(0x00400018))=(int)ISR_IRQ;
这样就将IRQ中断的服务程序入口地址(0x00300260)填写到中断向量表中的固定地址0x00400018开始的4字节空间了。
简单说就是:
在0x00000018的地址的跳转指令是:
B0x00000600
;
而0x00000600存放的指令是:
ldrr0=0x004000018;
而0x004000018
存放的是0x00300260:
=中断的服务程序ISR_IRQ的入口地址(0x00300260)
例子2:
ARM的vector表是存放在
c000b560T__stubs_start
c000b784T__vectors_start中断向量表的起始地址
内核建立vector的拷贝
---为何内核要拷贝到0xffff0000?
这个是armcpu的规定:
对于ARMv4及其以上的版本,异常向量表的起始位置由协处理器15(cp15)的控制寄存器(c1)里的V位(bit13)有关,当V=0时,异常向量表的起始位置在0x00000000,而当V=1时,异常向量表就起始于0xffff0000位置。
当有异常发生时,处理器会跳转到对应的0xffff0000起始的向量处取指令,然后,通过b指令散转到异常处理代码.因为ARM中b指令是相对跳转,而且只有+/-32MB的寻址范围,所以把__stubs_start~__stubs_end之间的异常处理代码复制到了0xffff0200起始处.这里可直接用b指令跳转过去,这样比使用绝对跳转(ldr)效率高。
三处理流程?
cpu发生中断的时候,PC指针如何知道到0x000000-0x0000001c(linux内核copy到0xffff0000)的地址(也就是到中断向量表vector中哪一种异常:
swi,数据异常,irq等)去执行中断跳转指令呢?
答案是:
中断控制器完成。
如下:
(来自网络ppt)
向量中断模式用于RESET、NMI、异常处理。
当向量中断产生时,控制器直接将PC赋值,如跳到0x0000000d处,而在0x0000000d地址处通常放置ISR服务程序地址。
处理流程分为两部分:
如下
1。
硬件部分:
EINTorIRQ硬件信号-----》中断控制器跳转---到对应的异常----(硬件doit)-----》改变pc指针的地址------》
2。
软件部分:
中断向量表跳转指令(如b__real_stubs_start)-------》对应的中断处理程序,比如一般的irq流程---》entry-armv.S@
-----》vector_stub
irq,IRQ_MODE,4
-).macrovector_stub,name,mode,correction=0(完成中断现场保护,CPU异常模式切换)
-)根据进入中断前的工作模式不同,程序下一步将跳转到_irq_usr、或__irq_svc等位置
.long
__irq_usr
@
0
(USR_26/USR_32)
__irq_invalid
1
(FIQ_26/FIQ_32)
2
(IRQ_26/IRQ_32)
__irq_svc
3
(SVC_26/SVC_32)
----》__irq_usr定义如下:
__irq_usr:
usr_entry
kuser_cmpxchg_check
irq_handler
get_thread_infotsk
mov
why,#0
ret_to_user_from_irq
UNWIND(.fnend
)
ENDPROC(__irq_usr)
-----》irq_handler定义如下:
.macro
#ifdefCONFIG_MULTI_IRQ_HANDLER
r1,=handle_arch_irq
r0,sp
adr
lr,BSYM(9997f)
pc,[r1]
#else
arch_irq_handler_default
#endif
----》arm/include/asm/entry-macro-multi.S:
6:
arch_irq_handler_default:
get_irqnr_preambler6,lr
1:
get_irqnr_and_baser0,r2,r6,lr
#get_irqnr_and_base函数完成获取IRQ中断号(irqnumber),依赖不同的soc的中断控制器
movne
r1,sp
@
@routinecalledwithr0=irqnumber,r1=structpt_regs*
adrne
lr,BSYM(1b)
bne
asm_do_IRQ
/*get_irqnr_and_base实现是依赖具体的硬件的,对于pxa270cpu,其实现如下:
.macroget_irqnr_and_base,irqnr,irqstat,base,tmp
mov/base,#io_p2v(0x40000000)@IIRCtl=0x40d00000
add/base,/base,#0x00d00000
ldr/irqstat,[/base,#0]@ICIP
ldr/irqnr,[/base,#4]@ICMR
ands/irqstat,/irqstat,/irqnr
beq1001f/*没找到中断,跳转*/
rsb/irqnr,/irqstat,#0
and/irqstat,/irqstat,/irqnr
clz/irqnr,/irqstat
rsb/irqnr,/irqnr,#(31-PXA_IRQ_SKIP)
#ifdefCONFIG_CPU_BULVERDE
b1002f
1001:
1002:
.endm
.macroirq_prio_table
接着---》asm_do_IRQ:
-->
handle_IRQ()------>
执行request_irq()注册的中断。
补充,EINT是共享一个IRQ,所以要到对应的IRQhandle里面,再处理不同的EINThandler,,如MTK
voidmt_eint_registration(unsignedinteint_num,unsignedintflag,#eint注册到IRQ:
MT_EINT_IRQ_ID
void(EINT_FUNC_PTR)(void),unsignedintis_auto_umask)
。
EINT_FUNC.eint_func[eint_num]=EINT_FUNC_PTR;
spin_unlock(&
eint_lock);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARM 中断 量表 响应 流程
![提示](https://static.bingdoc.com/images/bang_tan.gif)