ARM中断向量表与响应流程_第1页
ARM中断向量表与响应流程_第2页
ARM中断向量表与响应流程_第3页
ARM中断向量表与响应流程_第4页
ARM中断向量表与响应流程_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一 首先中断向量表定义在哪里?如何加载? 二 中断向量表与 中断服务程序三 处理流程/一 首先中断向量表定义在哪里?_vectors_start 首先中断向量表定义的是什么? 定义的就是中断服务程序的跳转指令,因为每个中断向量在向量表中只有一个字节的存储空间,只能存放一条指令,所以通常存放跳转指令,使程序跳转到存储器的其他地方,再执行中断处理。这里cpu就可以找中断服务程序,跳转指令如 例如:LDR PC, =ISR_HANDLER;或者指令与不同的cpu平台有关系。 1.1 vector表定义的方式:往往是变量地址:如 . .globl _vectors_start 定义

2、_vectors_start符号,这样外部程序可以访问到。entry-armv.S_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_offsetARM的异常处理向量表在entry-arm

3、v.S文件中:1.2 中断向量表 类型 From ARM .globl _vectors_start 定义_vectors_start符号,这样外部程序可以访问到。_vectors_start:定义异常(地址逻辑自上而下0x00-0x1c) 跟具体的cpu 特性有关 ARM(        swi        SYS_ERROR0        

4、)向量0:reset,但是这里被修改了,如果是cpu跑到了0地址,用软件中断SYS_ERROR0来处理. THUMB(        svc        #0                )向量1 THUMB(     

5、60;  nop                        )向量2W(b)        vector_und + stubs_offset 向量3 #未定义指令异常W(ldr)      &#

6、160; pc, .LCvswi + stubs_offset 向量4#软中断W(b)        vector_pabt + stubs_offset #向量5指令预取异常中断(Prefetch Abort )W(b)        vector_dabt + stubs_offset #向量6数据中止W(b)        vector_ad

7、drexcptn + stubs_offset #向量7地址异常These aren't too critical.W(b)        vector_irq + stubs_offset #向量8.IRQ(一般中断)W(b)        vector_fiq + stubs_offset #向量9 FIQ(快速中断)  /*关于.globl指令:    .global/.globl

8、命令     .global symbol     .global 使得连接程序(ld)能够识别 symbl    声明symbol是全局可见的。标号_start是GNU链接器用来指定第一个要执行指令所必须的,同样的是全局可见的(并且只能出现在一个模块中)     例如:        .global _start    #定义 _start 为外部程序可以访问的标签  _vectors

9、_start符号,又存放在哪里呢?有不同的方式,可以指定加载的ram地址,如kernelarchc6xkernel平台SECTIONS/* * Start kernel read only segment */READONLY_SEGMENT_START .vectors :_vectors_start = .;*(.vectors). = ALIGN(0x400);_vectors_end = .;指定好了vector在内核镜像加载到内存后的地址0x400; 但是arm就不指定,如下,在启动之后存放的地址:/中断服务处理程序 c000b500 T _kuser_helpe

10、r_start c000b500 t _kuser_memory_barrier c000b520 t _kuser_cmpxchg c000b540 t _kuser_get_tls c000b55c t _kuser_helper_version c000b560 T _kuser_helper_end c000b560 T _stubs_start /中断服务处理程序 c000b560 t vector_irq c000b5e0 t vector_dabt c000b660 t vector_pabt c000b6e0 t vector_und c000b760 t vector_fiq

11、 c000b764 t vector_addrexcptn c000b784 T _stubs_end c000b784 T _vectors_start中断向量表的起始地址 32字节 c000b7a4 T _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函数填充后的向量表如下:虚拟地

12、址 异常 处理汇编代码0xffff0000 reset swi SYS_ERROR00xffff0004 undefined b _real_stubs_start + (vector_undefinstr - _stubs_start)0xffff0008 软件中断 ldr pc, _real_stubs_start + (.LCvswi - _stubs_start)0xffff000c 取指令异常 b _real_stubs_start + (vector_prefetch - _stubs_start)0xffff0010 数据异常 b _real_stubs_start + (vec

13、tor_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) / 二 中断向量表与 中断服务程序 总的来说对于中断向量表的定义和存放(加载)和处理流程如下:首先理解相关概念: 

14、;中断控制器负责(1)屏蔽和过滤中断信号(2)唤醒cpu。分为向量中断模式和非向量中断模式:-向量中断模式用于RESET、NMI、异常处理。当向量中断产生时,控制器直接将PC赋值,如IRQ异常 跳到0x0000000d处,而在0x0000000d地址处通常放置ISR服务程序地址LDR PC, =ISR_HANDLER。 -非向量中断模式,有一个寄存器标识位,跳转到统一的函数地址,此函数通过判别寄存器标识位和优先级关系进行中断-处理。跳转指令:我分为两种: 1是中断控制器的跳转指令(实际上编译好的机器码):为何需要?因为当cpu在中断发生的时候,cpu如何知道把pc指针执行哪里去执行指

15、令呢。所以通过中断控制器的跳转指令帮助把cpu的执行指针pc,执行相应的中断向量表。  2是cpu相关的跳转指令,如arm处理器:b bl ,ldr等:完成跳转到不同的中断服务处理程序。    1)中断服务程序 定义在哪里?如arm的dataabort异常处理程序:首先跳转指令:b vector_dabt + stubs_offset ->这个地址的指令定义也在entry-armv.S: vector_stub dabt, ABT_MODE, 8-_dabt_svc (内核模式发生dataabort) 或者 _dabt_usr(用户模式发

16、生dataabort)-dabt_helper是一个宏->bl        CPU_DABORT_HANDLER 2)存放(加载)的地址?中断向量表定义好了之后,存放了ram的哪里呢?也就是_vectors_start存在内存什么地址? 答案:可以定在你需要的任何可访问ram地址(这里指的虚拟地址,不是物理ram地址)。 例子1 :单片机非向量中断模式假定非向量中断表定义在0x00400000开始的外部RAM空间: 引用网络 图2 中断解析示例流程  图2中

17、实线表示的流程都用ARM汇编语言编写,一般作为boot代码的一部分放在系统的底层模块中。填写向量表的操作可以在上层应用程序中方便地实现,比如在C语言中: *( int *(0x00400018) = (int) ISR_IRQ;这样就将IRQ中断的服务程序入口地址(0x00300260)填写到中断向量表中的固定地址0x00400018开始的4字节空间了。  简单说就是:在0x00000018 的地址的跳转指令是:B 0x00000600 ;而0x00000600 存放的指令是:ldr r0 =0x004000018 ; 而0x004000018 存放的是0x00300260

18、:=中断的服务程序ISR_IRQ的入口地址(0x00300260)  例子2:ARM 的vector 表 是存放在 c000b500 T _kuser_helper_start c000b500 t _kuser_memory_barrier c000b520 t _kuser_cmpxchg c000b540 t _kuser_get_tls c000b55c t _kuser_helper_version c000b560 T _kuser_helper_end c000b560 T _stubs_start c000b560 t vector_irq c000b5e0

19、 t vector_dabt c000b660 t vector_pabt c000b6e0 t vector_und c000b760 t vector_fiq c000b764 t vector_addrexcptn c000b784 T _stubs_end c000b784 T _vectors_start中断向量表的起始地址 c000b7a4 T _vectors_end内核建立vector的拷贝_trap_init函数填充后的向量表如下:虚拟地址 异常 处理汇编代码0xffff0000 reset swi SYS_ERROR00xffff0004 undefined b _real

20、_stubs_start + (vector_undefinstr - _stubs_start)0xffff0008 软件中断 ldr pc, _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 + (vec

21、tor_addrexcptn - _stubs_start)0xffff0018 irq b _real_stubs_start + (vector_IRQ - _stubs_start)0xffff001c Fiq b _real_stubs_start + (vector_FIQ - _stubs_start)-为何内核要拷贝到0xffff0000?这个是arm cpu的规定:对于ARMv4及其以上的版本,异常向量表的起始位置由协处理器15(cp15)的控制寄存器(c1)里的V位(bit13)有关,当V=时,异常向量表的起始位置在0x00000000,而当V=时,异常向量表就起始于0xff

22、ff0000位置。当有异常发生时,处理器会跳转到对应的0xffff0000起始的向量处取指令,然后,通过b指令散转到异常处理代码因为ARM中b指令是相对跳转,而且只有+/-32MB的寻址范围,所以把_stubs_start_stubs_end之间的异常处理代码复制到了0xffff0200起始处这里可直接用b指令跳转过去,这样比使用绝对跳转(ldr)效率高。 三 处理流程? cpu发生中断的时候,PC指针如何知道到0x000000-0x0000001c(linux内核copy到0xffff0000)的 地址(也就是到中断向量表vector中哪一种异常:swi,数据异常,irq等)去执行

23、中断跳转指令呢?答案是:中断控制器完成。如下:  (来自网络ppt)向量中断模式用于RESET、NMI、异常处理。当向量中断产生时,控制器直接将PC赋值,如跳到0x0000000d处,而在0x0000000d地址处通常放置ISR服务程序地址。 处理流程分为两部分:如下 1。硬件部分:EINT or IRQ硬件信号-中断控制器跳转-到对应的异常-(硬件do it)-改变pc指针的地址-2。软件部分:中断向量表 跳转指令(如b _real_stubs_start)-对应的中断处理程序,比如一般的irq流程 -entry-armv.S -vector_stub 

24、;       irq, IRQ_MODE, 4 -).macro vector_stub, name, mode, correction=0(完成中断现场保护,CPU异常模式切换)-) 根据进入中断前的工作模式不同,程序下一步将跳转到_irq_usr 、或_irq_svc等位置.long        _irq_usr          

25、0;              0 (USR_26 / USR_32).long        _irq_invalid                      

26、60;  1 (FIQ_26 / FIQ_32).long        _irq_invalid                         2 (IRQ_26 / IRQ_32).long      &

27、#160; _irq_svc                         3 (SVC_26 / SVC_32)  -_irq_usr定义如下:_irq_usr:usr_entrykuser_cmpxchg_checkirq_handlerget_thread_info tskmov    &#

28、160;   why, #0b        ret_to_user_from_irq UNWIND(.fnend                )ENDPROC(_irq_usr)  -irq_handler定义如下:.macro       &#

29、160;irq_handler#ifdef CONFIG_MULTI_IRQ_HANDLERldr        r1, =handle_arch_irqmov        r0, spadr        lr, BSYM(9997f)ldr        pc, r1#el

30、search_irq_handler_default#endif -arm/include/asm/entry-macro-multi.S:6:        .macro        arch_irq_handler_default:.macro        arch_irq_handler_defaultget_irqnr_preamble

31、 r6, lr1:        get_irqnr_and_base r0, r2, r6, lr#get_irqnr_and_base函数完成获取IRQ中断号(irq number),依赖不同的soc的中断控制器movne        r1, sp routine called with r0 = irq number, r1 = struct pt_regs *adrne        lr, BSYM(1b)bne        asm_do_IRQ 

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论