ARM中断向量表与响应流程
- 格式:doc
- 大小:124.50 KB
- 文档页数:18
NVIC(Nested Vectored Interrupt Controller)是ARM Cortex-M处理器中的中断控制器,用于管理和分配中断请求。
它负责处理和分发来自外部设备和内部异常的中断,并协调处理器对这些中断的响应。
NVIC的中断控制原理如下:1. 中断向量表(Interrupt Vector Table):处理器在启动时会加载一个中断向量表,其中包含了每个中断源对应的中断处理函数的地址。
当中断发生时,处理器会根据中断号从中断向量表中找到相应的中断处理函数地址并跳转到该地址执行处理代码。
2. 中断优先级:NVIC支持对中断源设置不同的优先级。
中断优先级决定了当多个中断同时发生时,处理器选择响应哪个中断。
较高优先级的中断将被立即响应,而较低优先级的中断将等待高优先级中断的处理完成。
3. 中断屏蔽:NVIC允许对中断进行屏蔽,即阻止某些中断源触发中断。
通过配置NVIC寄存器,可以设置中断的使能和屏蔽状态,从而灵活地控制中断的触发和响应。
4. 嵌套中断处理:NVIC支持嵌套中断处理。
当一个中断正在处理时,如果有一个具有更高优先级的中断发生,处理器会暂停当前中断的处理,转而处理更高优先级的中断。
待更高优先级中断处理完成后,处理器恢复到原来的中断处理过程继续执行。
5. 中断处理完全和上下文切换:NVIC负责保存和恢复中断处理时的上下文信息。
当中断发生时,处理器会自动保存当前的寄存器状态,并在中断处理完成后恢复到原来的状态,使得中断处理过程对程序的执行状态是透明的。
通过上述原理及相关设置,NVIC可以有效地管理多个中断源,确保按照优先级响应中断,并提供嵌套中断处理的能力,从而实现可靠的中断控制。
Arm的中断处理流程1:芯片输入管脚,按照中断的配置发生变化,(比如产生上升沿),arm芯片内部就会检测到中断。
2:ARM要求中断向量表必须放置在从0开始、连续8×4字节的空间内。
所以地址空间“0x00000000-0x00000032”就是所谓的中断向量表。
3:arm检测到中断后,会根据中断的类型强行设置PC寄存器的值。
把当前cpsr的内容保存到spsr_mode . 然后改变cpsr得内容。
(并且把相应的irq或者fiq设置为1,以禁止中断)中断的类型如下表:比如,这个时候来的是复位中断,则IP寄存器的值为0x00000000, 如果来的是IRQ中断则设置IP寄存器的值为 0x00000018。
注意上述中断信号的产生, cpsr 内容的保存,cpsr自动更改,PC寄存器值的设置,都是arm硬件自动完成。
4: arm CPU接下来就会从“IP寄存器所指的地址”内取指令,比如IP内的值是0x00000018,则会从地址 0x00000018 内取指令。
5:中断向量表的内容是我们先前设置好的。
假设是一个IRQ , 0x00000018处的指令为:B INT_IRQ;则代码跳到 INT_IRQ 处的程序执行。
6:INT_IRQ;; /* This Code is to fix a bug in the ARM Core */;STMDB sp!, {r1}MRS r1, SPSRTST r1, #I_BITLDMIA sp!, {r1}SUBNES pc,lr,#4; //保存环境; /* End ARM Core Fix */STMDB sp!, {a1 - v7, fp, ip, lr} ; Save context…… //里面会进行某些状态位判断,以确定具体是哪个中断,然后调用相应处理程序//恢复环境INT_IRQ_EXITLDMIA sp!, {a1 - v7, fp, ip, lr} ; Restore contextSUBS pc, lr, #4 ; Return to interrupted codeEND ; end file7:What happens if an interrupt occurs as it is being disabled?Applies to:If an interrupt is received by the core during execution of an instruction that disables interrupts, the ARM7 family will still take the interrupt. This occurs for both IRQ and FIQ interrupts.For example, consider the follow instruction sequence:MRS r0, cpsrORR r0, r0, #I_Bit:OR:F_Bit ;disable IRQ and FIQ interruptsMSR cpsr_c, r0If an IRQ interrupt is received during execution of the MSR instruction, then the behavior will be as follows:The IRQ interrupt is latchedThe MSR cpsr, r0 executes to completion setting both the I bit and the F bit in the CPSRThe IRQ interrupt is taken because the core was committed to taking the interrupt exception before the I bit was set in the CPSR. The CPSR (with the I bit and F bit set) is moved to the SPSR_irq上面是arm的一个bug。
nvic中断的工作原理和使用方法中断是计算机系统中一种重要的事件处理机制,用于在系统运行过程中处理和响应各种外部事件和异常情况。
中断是一种异步事件,能够打断当前正在执行的指令序列,转而执行中断处理程序,然后再返回到原来的执行位置继续执行。
中断控制器是负责管理和处理中断的硬件设备。
常见的中断控制器有基于硬件的8259和基于软件的NVIC(Nested Vectored Interrupt Controller)。
本文将详细介绍NVIC中断的工作原理和使用方法。
一、NVIC中断的工作原理NVIC是一种设备级中断控制器,广泛应用于ARM Cortex-M系列微控制器中。
它的主要工作原理如下:1.中断优先级:每个中断都有一个固定的优先级,优先级高的中断在发生时可以立即打断正在执行的指令序列。
ARM Cortex-M微控制器支持动态优先级,可以在运行时改变中断的优先级。
2.中断向量表:NVIC使用一个特殊的存储区域来保存中断向量表(Interrupt Vector Table)。
中断向量表是一个数组,其中每个元素都是一个指向中断处理程序的地址。
当中断发生时,CPU会根据中断号从中断向量表中找到对应的中断处理程序并跳转到该地址执行。
3.中断处理程序:每个中断都有一个对应的中断处理程序,用于处理中断事件。
中断处理程序一般包括保存寄存器状态、处理中断事件、发送中断产生的结果等步骤。
在中断处理程序执行完毕后,CPU会根据中断优先级重新选择下一个要执行的中断处理程序。
4.嵌套中断:NVIC支持嵌套中断,即在一个中断处理程序中允许发生其他中断。
当一个中断处理程序正在执行时,如果发生了其他中断,CPU会中断当前的中断处理程序,先执行新的中断处理程序。
当新的中断处理程序执行完毕后,CPU会返回到之前中断处理程序的执行位置继续执行。
二、NVIC中断的使用方法NVIC中断的使用方法包括中断初始化、中断注册和中断处理程序的编写。
ARM7支持六种操作模式:(1)用户模式(usr):正常的程序执行状态(2)FIQ模式(fiq):支持数据传送或通道处理(3)IRQ模式(irq):用于通用的中断处理(4)管理模式(svc):用于操作系统的保护模式(5)异常模式(abt):数据或者指令预取异常时进入(6)无定义模式(und):当无定义指令被执行时进入(7)软件控制,外部中断,异常处理都可以改变操作模式。
大部分的应用程序在用户模式下执行。
其他模式,比如管理模式,在中断、异常服务、或者访问被保护资源时进入。
ARM 的中央寄存器集是16 个用户寄存器R0 – R15。
这些寄存器均是32 位宽度,R0 – R12 没有其他特殊功能,寄存器R13 – R15在CPU中有特殊功能。
R13被用作栈指针(stack pointer,SP)。
R14被称为链接寄存器(link register, LR),当调用一个函数时返回地址被自动保存到链接寄存器,在函数返回时有效。
这使得快速进入和返回“叶”函数(不调用其他函数的函数)成为可能。
如果函数是分支的一部分(即该函数将调用另一个函数),链接寄存器必须入栈(R13)。
R15 是程序计数器(program counter, PC)。
有趣的是,许多指令也可以在R13 – R15中执行,就像它们是标准的用户寄存器。
ARM中断的问题ARM的七种异常类型---------1> 复位异常2> 数据访问中止异常3> 快速中断请求异常4> 一般中断请求5> 预取指令异常6> 软件中断异常7> 未定义异常-------------------------问题:1> 为什么除了进入复位异常模式外,在别的异常处理模式中都允许FIQ中断?2> 数据访问中止异常的优先级大于 FIQ异常,为什么在数据访问异常处理模式中,还允许 FIQ中断?这样不就成了:在高优先级异常处理中允许低优先级的中断发生?即使这样,因为FIQ中断的优先级 < 数据异常中断优先级,也不会进入 FIQ中断处理程序啊,这样不就更没有用处了??ARM体系的各种异常的分析(学习日记)- [ARM7TDMI]版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明/logs/10669519.html1.复位异常(1)当内核的nRESET信号被拉低时,ARM处理器放弃正在执行的指令,当nRESET信号再次变高时,ARM处理器进行复位操作;(2)系统复位后,进入管理模式对系统进行初始化,复位后,只有PC(0x00000000)和CPSR (nzcvqIFt_SVC)的值是固定的,另外寄存器的值是随机的。
ARM 的异常处理学习笔记转贴ARM的异常处理这部分比较不好理解。
当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。
当异常中断处理程序执行完成后,程序返回到发生中断指令的下条指令处执行。
在进入异常中断处理程序时,要保存被中断程序的执行现场,从异常中断处理程序退出时,要恢复被中断程序的执行现场。
1、引起异常的原因(1)、指令执行引起的异常软件中断、未定义指令(包括所要求的协处理器不存在是的协处理器指令)、预取址中止(存储器故障)、数据中止。
(2)、外部产生的中断复位、FIQ、IRQ。
2、ARM中异常中断的种类(1)、复位(RESET)a、当处理器复位引脚有效时,系统产生复位异常中断,程序跳转到复位异常中断处理程序处执行,包括系统加电和系统复位。
b、通过设置PC跳转到复位中断向量处执行称为软复位。
(2)、未定义的指令当ARM处理器或者是系统中的协处理器认为当前指令未定义时,产生未定义的指令异常中断,可以通过改异常中断机制仿真浮点向量运算。
(3)、软件中断这是一个由用户定义的中断指令(SWI)。
可用于用户模式下的程序调用特权操作指令。
在实时操作系统中可以通过该机制实现系统功能调用。
(4)、指令与取终止(Prefech Abort)如果处理器预取的指令的地址不存在,或者该地址不允许当前指令访问,当被预取的指令执行时,处理器产生指令预取终止异常中断。
(5)、数据访问终止(DATAABORT)如果数据访问指令的目标地址不存在,或者该地址不允许当前指令访问,处理器产生数据访问终止异常中断。
(6)、外部中断请求(IRQ)当处理器的外部中断请求引脚有效,而且CPSR的寄存器的I控制位被清除时,处理器产生外部中断请求异常中断。
系统中个外设通过该异常中断请求处7)、快速中断请求(FIQ) 理服务。
(当处理器的外部快速中断请求引脚有效,而且CPSR的F控制位被清除时,处理器产生外部中断请求异常中断。
简述中断处理步骤中断是计算机系统中一种重要的事件响应机制,它可以打断正在执行的程序,转而执行相应的中断处理程序,以处理特定的事件或异常情况。
中断处理步骤是指在中断发生时,计算机系统进行的一系列操作和处理流程。
下面将对中断处理步骤进行简单的描述。
1. 中断的触发中断的触发是指中断事件的发生。
中断事件可以是来自硬件设备的信号(如键盘输入、鼠标点击、定时器溢出等),也可以是来自软件的请求(如系统调用、异常情况等)。
当中断事件发生时,计算机系统会立即暂停当前正在执行的程序,转而执行相应的中断处理程序。
2. 保存上下文在进行中断处理之前,计算机系统需要保存当前程序的上下文信息,以便在中断处理完成后能够恢复到中断前的状态。
上下文信息包括程序计数器、寄存器的值、堆栈指针等。
通过保存上下文,可以确保在中断处理完成后能够正确地返回到原来的程序继续执行。
3. 中断向量表中断向量表是一个存储中断处理程序入口地址的数据结构。
当中断事件发生时,计算机系统会根据中断类型或编号查找中断向量表,找到对应的中断处理程序入口地址,并跳转到该地址开始执行中断处理程序。
中断向量表可以通过硬件或软件方式进行配置和更新。
4. 中断处理程序中断处理程序是一段特殊的代码,用于处理中断事件。
中断处理程序的功能包括对中断事件的识别、处理和响应。
根据中断类型的不同,中断处理程序可能需要进行一系列的操作,如读取输入设备的数据、更新系统状态、发送输出数据等。
中断处理程序的编写需要考虑到效率和实时性的要求。
5. 中断优先级计算机系统中可能存在多个中断事件同时发生的情况,这就引出了中断优先级的概念。
中断优先级用于确定在多个中断事件发生时,系统应该先处理哪个中断。
通常,系统会根据中断类型、重要性和紧急程度等因素来确定中断的优先级顺序。
在处理多个中断时,需要根据中断优先级进行适当的调度和处理。
6. 中断处理完成当中断处理程序执行完毕后,计算机系统会根据保存的上下文信息恢复到中断前的状态,并继续执行被中断的程序。
ARM的启动和中断向量表启动的⽅式对于S3C2440⽽⾔,启动的⽅式有两种,⼀是Nor Flash⽅式启动,⼆是Nand Flash⽅式启动。
使⽤Nor Flash⽅式启动Nor Flash的地址范围如下0x0000.0000—0x0800.0000 (2M Nor Flash)⽚内的BootSRAM地址被置为0x4000.0000—0x4000.DFFF (4K BootSRAM)由于可以在Nor Flash直接运⾏代码,因此BootSRAM被映射到别的地址上去,可作为其他⽤途。
程序映像直接存放到NOR FLASH⾥⾯,中断向量表存放在0x0000.0000开始的8×4⼤⼩的空间中。
中断产⽣时,PC被置为相对应的向量地址。
如上电或者按Reset键时,PC直接置为0x00,从NOR FLASH的0x00处开始执⾏。
使⽤NAND Flash⽅式启动此时,⽚内的BootSRAM地址被置为0x0000.0000—0x0800.0000 (4K BootSRAM)NAND Flash地址接NFCE由于NAND Flash中不能运⾏代码,因此必须复制到内存之中再运⾏。
程序映像存放在NAND FLASH中,中断向量表位置在程序映像的最前⾯。
由于NAND FLASH不能运⾏代码,系统上电或者Reset的时候,内置的NAND FLASH 将访问控制接⼝,并将中断向量表和引导代码⾃动加载到内部SRAM(此时该SRAM 定位于起始地址空间0x00000000,容量为4KB),并且置PC值为0x00运⾏程序(这⼀切是有芯⽚内部的硬件逻辑完成的)。
之后,SRAM 中的引导程序将操作系统镜像加载到SDRAM 中,操作系统就能够在SDRAM 中运⾏。
启动完毕,4KB 的启动SRAM 就可以⽤于其他⽤途。
中断向量表的设置ARM中的异常与中断总共有7种按响应优先级从⾼到低按中断向量表顺序复位复位数据中⽌未定义指令中断FIQ SWIIRQ预取指令中⽌预取指令中⽌数据中⽌异常未定义指令、SWI IRQFIQARM要求中断向量表必须放置在从0地址开始,连续8×4字节的空间内(ARM720T和ARM9、ARM10也⽀持从0xFFFF0000开始的⾼地址向量表),各异常和中断向量在向量表中的位置如下地址中断0x00Reset0x04Undef0x08SWI0x0C Prefetch Abort0x10Data Abort0x14(Reserved)0x18IRQ0x2C FIQ0x2C FIQ当中断产⽣时ARM处理器强制把PC指针置为中断向量表中相对应的向量地址。
ARM中断程序的原理和实现引言:中断是计算机系统中一种特殊的事件,它可以打断当前正在执行的程序,并执行一段特定的代码。
在ARM架构中,中断主要由两部分组成:中断处理程序和中断控制器。
本文将介绍ARM中断程序的原理和实现,包括中断的基本概念、中断的分类、中断的处理过程以及中断控制器的实现方式。
一、中断的基本概念中断可以看作是外部设备向CPU发送一个请求的一种方法。
当外部设备发生一些特定的事件时(如按键、时钟周期等),它会产生一个中断请求信号,通知CPU去处理相应的事件。
CPU收到中断请求信号后,会暂停当前的任务,保存现场并跳转到中断处理程序来处理中断。
二、中断的分类1.外部中断:外部中断是由外设产生的中断信号,如GPIO、串口等。
当外设产生中断请求信号时,中断控制器会将信号传递给CPU,触发相应的中断处理程序。
2.软件中断:软件中断是由软件主动触发的中断,通过软件指令可以触发中断控制器发送中断请求信号给CPU。
软件中断可以用于实现系统调用、任务切换等功能。
三、中断的处理过程1.中断请求:外部设备发生特定事件,产生中断请求信号。
中断请求信号会被中断控制器接收并传递给CPU。
2.中断响应:CPU收到中断请求信号后,会立即响应中断,并执行中断处理程序。
在响应中断之前,CPU需要保存当前的现场(包括程序计数器PC、寄存器等)。
3.中断处理:CPU跳转到中断处理程序的入口地址,开始执行中断处理程序。
中断处理程序通常用来处理中断事件,并根据需要进行中断服务例程的调用。
4.中断返回:中断处理程序执行完毕后,CPU会根据中断处理程序的返回指令返回到原来的程序中,并恢复之前保存的现场。
同时,中断控制器会清除中断请求信号,使其能够接受新的中断请求。
四、中断控制器的实现方式ARM架构中,中断控制器常用的实现方式包括级联式中断控制器和向量式中断控制器。
1.级联式中断控制器:级联式中断控制器是一种层级结构的中断控制器。
它包含多个级别的中断控制器,每个级别对应一组中断请求。
简述中断处理的过程中断是计算机系统中常见的一种机制,用于处理外部事件或错误条件。
当系统遇到需要立即处理的事件时,会触发中断,暂停当前任务的执行,转而执行中断处理程序。
中断处理的过程可以概括为以下几个步骤:1. 中断触发中断可以由外部设备发出,如键盘输入、鼠标移动等;也可以由内部事件引发,如除零错误、内存溢出等。
无论何种情况,一旦中断事件发生,计算机系统就会暂停当前任务的执行,转而处理中断。
2. 保存现场在开始执行中断处理程序之前,系统需要保存当前任务的执行状态,以便在处理完中断后能够恢复到原来的状态。
这包括保存当前的程序计数器值、寄存器状态、堆栈指针等信息。
3. 中断向量表计算机系统通常会预先定义一张中断向量表,其中记录了每种中断类型对应的中断处理程序的入口地址。
当中断发生时,系统根据中断类型查找中断向量表,找到对应的中断处理程序的入口地址。
4. 中断处理程序的执行系统根据中断向量表中找到的入口地址,开始执行对应的中断处理程序。
中断处理程序是预先编写好的一段代码,用于处理特定的中断事件。
它可以读取输入设备的数据、更新相关状态、进行必要的计算等操作。
5. 中断处理程序的结束一旦中断处理程序执行完毕,系统需要恢复之前保存的执行状态。
这包括恢复原来的程序计数器值、寄存器状态、堆栈指针等信息。
6. 重新执行原任务当中断处理程序结束后,系统回到原来的任务继续执行。
由于中断的处理是在一个独立的上下文中进行的,所以原任务的执行状态不会受到中断的影响,可以无缝地继续执行。
在中断处理的过程中,需要注意以下几点:1. 中断处理程序的设计需要高效且可靠。
由于中断可能会频繁发生,所以中断处理程序的执行时间应尽可能短,以免影响其他任务的执行。
同时,中断处理程序要能够正确地处理中断事件,并根据需要进行必要的操作。
2. 中断处理程序需要与操作系统和硬件设备紧密配合。
操作系统负责管理中断的注册和分发,硬件设备负责产生中断信号。
一首先中断向量表定义在哪里?如何加载?二中断向量表与中断服务程序三处理流程/////////////////////////////////////////////////////////////////// /////////////////////////////////一首先中断向量表定义在哪里?__vectors_start首先中断向量表定义的是什么?定义的就是中断服务程序的跳转指令,因为每个中断向量在向量表中只有一个字节的存储空间,只能存放一条指令,所以通常存放跳转指令,使程序跳转到存储器的其他地方,再执行中断处理。
这里cpu就可以找中断服务程序,跳转指令如例如:LDR PC, =ISR_HANDLER;或者指令与不同的cpu平台有关系。
1.1 vector表定义的方式:往往是变量地址:如 ..globl __vectors_start 定义__vectors_start符号,这样外部程序可以访问到。
entry-armv.S__vectors_start:swi SYS_ERROR0b vector_und + stubs_offsetldr pc, .LCvswi + stubs_offsetb vector_pabt + stubs_offsetb vector_dabt + stubs_offsetb vector_addrexcptn + stubs_offsetb vector_irq + stubs_offsetb vector_fiq + stubs_offsetARM的异常处理向量表在entry-armv.S文件中:1.2 中断向量表类型From ARM.globl __vectors_start 定义__vectors_start符号,这样外部程序可以访问到。
__vectors_start:定义异常(地址逻辑自上而下0x00----0x1c) 跟具体的cpu 特性有关ARM( swi SYS_ERROR0 )向量0:reset,但是这里被修改了,如果是cpu跑到了0地址,用软件中断SYS_ERROR0来处理.THUMB( svc #0)向量1THUMB( nop)向量2W(b) vector_und + stubs_offset 向量3 #未定义指令异常W(ldr) pc, .LCvswi + stubs_offset 向量4#软中断W(b) vector_pabt + stubs_offset #向量5指令预取异常中断(Prefetch Abort )W(b) vector_dabt + stubs_offset #向量6数据中止W(b) vector_addrexcptn + 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 命令.global symbol.global 使得连接程序(ld)能够识别 symbl声明symbol是全局可见的。
标号_start是GNU链接器用来指定第一个要执行指令所必须的,同样的是全局可见的(并且只能出现在一个模块中)例如:.global _start #定义 _start 为外部程序可以访问的标签__vectors_start符号,又存放在哪里呢?有不同的方式,可以指定加载的ram地址,如\kernel\arch\c6x\kernel平台SECTIONS{/** Start kernel read only segment*/READONLY_SEGMENT_START.vectors :{_vectors_start = .;*(.vectors). = ALIGN(0x400);_vectors_end = .;}指定好了vector在内核镜像加载到内存后的地址0x400;但是arm就不指定,如下,在启动之后存放的地址://中断服务处理程序c000b500 T __kuser_helper_startc000b500 t __kuser_memory_barrierc000b520 t __kuser_cmpxchgc000b540 t __kuser_get_tlsc000b55c t __kuser_helper_versionc000b560 T __kuser_helper_endc000b560 T __stubs_start //中断服务处理程序c000b560 t vector_irqc000b5e0 t vector_dabtc000b660 t vector_pabtc000b6e0 t vector_undc000b760 t vector_fiqc000b764 t vector_addrexcptnc000b784 T __stubs_endc000b784 T __vectors_start中断向量表的起始地址 32字节c000b7a4 T __vectors_end2.其次向量表在系统bootup的时候被链接在哪里?/out/target/product/huaqin82_cwet_kk/obj/KERNEL_OBJ/arch/arm/kernel /entry-armv.o 打包成build-in.o3,最后内核建立向量表vector的拷贝__trap_init函数填充后的向量表如下://///////////////////////////////////////////////////////////////// ////////////////////////////////////////////二中断向量表与中断服务程序总的来说对于中断向量表的定义和存放(加载)和处理流程如下:首先理解相关概念:1)中断服务程序定义在哪里?如arm的dataabort异常处理程序:首先跳转指令:b vector_dabt + stubs_offset ---->这个地址的指令定义也在entry-armv.S:vector_stub dabt, ABT_MODE, 8----》__dabt_svc (内核模式发生dataabort)或者 __dabt_usr(用户模式发生dataabort)-----》dabt_helper是一个宏--->bl CPU_DABORT_HANDLER2)存放(加载)的地址?中断向量表定义好了之后,存放了ram的哪里呢?也就是__vectors_start存在内存什么地址?答案:可以定在你需要的任何可访问ram地址(这里指的虚拟地址,不是物理ram地址)。
例子1 :单片机非向量中断模式假定非向量中断表定义在0x00400000开始的外部RAM空间:引用网络图2 中断解析示例流程图2中实线表示的流程都用ARM汇编语言编写,一般作为boot代码的一部分放在系统的底层模块中。
填写向量表的操作可以在上层应用程序中方便地实现,比如在C语言中:*( int *(0x00400018)) = (int) ISR_IRQ;这样就将IRQ中断的服务程序入口地址(0x00300260)填写到中断向量表中的固定地址0x00400018开始的4字节空间了。
简单说就是:在0x00000018 的地址的跳转指令是:B 0x00000600 ;而0x00000600 存放的指令是:ldr r0 =0x004000018 ;而0x004000018 存放的是0x00300260:=中断的服务程序ISR_IRQ的入口地址(0x00300260)例子2:ARM 的vector 表是存放在c000b500 T __kuser_helper_startc000b500 t __kuser_memory_barrierc000b520 t __kuser_cmpxchgc000b540 t __kuser_get_tlsc000b55c t __kuser_helper_versionc000b560 T __kuser_helper_endc000b560 T __stubs_startc000b560 t vector_irqc000b5e0 t vector_dabtc000b660 t vector_pabtc000b6e0 t vector_undc000b760 t vector_fiqc000b764 t vector_addrexcptnc000b784 T __stubs_endc000b784 T __vectors_start中断向量表的起始地址c000b7a4 T __vectors_end内核建立vector的拷贝__trap_init函数填充后的向量表如下:---为何内核要拷贝到0xffff0000?这个是arm cpu的规定:对于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。
硬件部分:EINT or IRQ硬件信号-----》中断控制器跳转---到对应的异常----(硬件do it)-----》改变pc指针的地址------》2。
软件部分:中断向量表跳转指令(如b __real_stubs_start)-------》对应的中断处理程序,比如一般的irq流程 ---》entry-armv.S@ -----》vector_stub irq, IRQ_MODE, 4-).macro vector_stub, name, mode, correction=0(完成中断现场保护,CPU异常模式切换)-) 根据进入中断前的工作模式不同,程序下一步将跳转到_irq_usr 、或__irq_svc等位置.long __irq_usr@ 0 (USR_26 / USR_32).long __irq_invalid@ 1 (FIQ_26 / FIQ_32).long __irq_invalid@ 2 (IRQ_26 / IRQ_32).long __irq_svc@ 3 (SVC_26 / SVC_32)----》__irq_usr定义如下:__irq_usr:usr_entrykuser_cmpxchg_checkirq_handlerget_thread_info tskmov why, #0b ret_to_user_from_irq UNWIND(.fnend ) ENDPROC(__irq_usr)-----》irq_handler定义如下:.macro irq_handler#ifdef CONFIG_MULTI_IRQ_HANDLERldr r1, =handle_arch_irqmov r0, spadr lr, BSYM(9997f)ldr pc, [r1]#elsearch_irq_handler_default#endif----》arm/include/asm/entry-macro-multi.S:6:@ .macro arch_irq_handler_defaul t:.macro arch_irq_handler_defaultget_irqnr_preamble 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/*get_irqnr_and_base实现是依赖具体的硬件的,对于pxa270 cpu,其实现如下:.macro get_irqnr_and_base, irqnr, irqstat, base, tmpmov /base, #io_p2v(0x40000000) @ IIR Ctl = 0x40d00000add /base, /base, #0x00d00000ldr /irqstat, [/base, #0] @ ICIPldr /irqnr, [/base, #4] @ ICMRands /irqstat, /irqstat, /irqnrbeq 1001f /* 没找到中断,跳转*/rsb /irqnr, /irqstat, #0and /irqstat, /irqstat, /irqnrclz /irqnr, /irqstatrsb /irqnr, /irqnr, #(31 - PXA_IRQ_SKIP)#ifdef CONFIG_CPU_BULVERDEb 1002f#endif1001:1002:.endm.macro irq_prio_table.endm*/接着---》asm_do_IRQ:-->handle_IRQ()------>执行request_irq()注册的中断。