ARM_Linux_中断异常的处理分析

合集下载

单片机的中断与异常处理方法

单片机的中断与异常处理方法

单片机的中断与异常处理方法在单片机的工作过程中,中断和异常处理是非常重要的概念和方法。

它们能够有效地提高单片机的响应能力和灵活性,使其能够应对各种不同的工作需求和问题。

本文将介绍单片机中断的概念、中断的种类以及针对不同中断的处理方法,同时也会探讨单片机异常处理的原理和方法。

一、中断的概念和种类中断是指在一个程序执行的过程中,由于某种特殊的事件发生,导致程序的正常执行被打断,转而去执行一个与当前任务无关的子程序,完成该事件的相应处理。

中断可以分为外部中断和内部中断两种。

1. 外部中断外部中断是指当单片机外部引脚的电平或信号发生变化时,引发中断事件,使单片机停止当前任务的执行,去处理由该外部事件引发的中断服务程序(ISR)。

外部中断常用于与外部设备的交互,如按键输入、传感器检测等。

在编程中,我们可以通过设置中断触发条件和编写相应的中断服务程序来实现对外部中断的处理。

2. 内部中断内部中断是指当单片机内部某个特定的事件发生时,由硬件或软件触发中断请求,并且将控制权交给中断服务程序进行相应的处理。

内部中断的发生可以是由于某个特定条件的满足,如定时器溢出中断、串口接收中断等;也可以是由软件的运行结果触发,如除法溢出中断、地址错误中断等。

不同的内部中断需要通过编程实现相应的中断服务程序。

二、中断的处理方法中断处理是指在中断发生时,单片机通过中断向量表找到相应的中断服务程序,并对中断事件进行处理的过程。

下面将介绍两种常用的中断处理方法。

1. 优先级中断处理优先级中断处理是指对多个中断源按照优先级进行划分和处理的方法。

在单片机的中断系统中,每个中断源都被赋予了一个优先级,高优先级的中断可以打断当前正在执行的低优先级中断,从而增加了中断的响应速度和灵活性。

优先级中断处理需要在编程时设置中断的优先级,并根据不同的中断事件编写相应的中断服务程序。

2. 嵌套中断处理嵌套中断处理是指当一个中断正在执行的过程中,又发生了另一个中断时,将当前中断挂起,转而处理新发生的中断,并在处理完毕后返回原中断继续执行的方法。

ARM异常与X86架构中断

ARM异常与X86架构中断
1.对x86架构而言,中断是由异步的部事件引起的。外 部事件及中断响应与正执行的指令没有关系。 异常是在执行指令期间检测到不正常的或非法的条件所 引起的。异常与正执行的指令有直接的联系。
2.ARM中,当正常的程序执行流程发生暂时的停止时,称 之为异常。中断包括在异常模式之内。
相同点:
1.ARM异常和X86中断一样,在执行时都会保护现场,在异常或中断 处理完之后会恢复现场,并且多个异常或中断会按照一定的优先级顺 序执行; 2.异常和中断的过程类似(请求、响应、处理、返回); 3.异常和中断可类似得分为软件和硬件两方面; 4.两者都提高了CPU的工作效率,能实现实时处理和故障处理;
不同点:
1.ARM异常的原因是正在执行的程序的暂停,而X86中断是由异步的 外部事件引起的,前者范围比后者要宽泛; 2.中断可以被屏蔽,而异常需要得到及时响应和处理,通常不能被屏 蔽。

Linux内核中ARM中断实现详解request_irq()、free_irq()

Linux内核中ARM中断实现详解request_irq()、free_irq()

Linux内核中ARM中断实现详解request_irq()、free_irq()Request_irq()调用的定义:int request_irq(unsigned int irq,void (*handler)(int irq, void *dev_id, struct pt_regs *regs),unsigned long irqflags,const char * devname,void *dev_id);irq 是要申请的硬件中断号。

具体应是何值参见博文blog.csdn/songqqnew/article/details/6791602。

handler 是向系统注册的中断处理函数,是一个回调函数,中断发生时,系统调用这个函数,dev_id 参数将被传递给它。

即是中断服务子程序,用staticirqreturn_tadc_interrupt(intirq,void*dev_id);定义或声明。

Irqflags 是中断处理的一些属性。

若设置了IRQF_DISABLED (老版本中的SA_INTERRUPT,本版zhon 已经不支持了),则表示中断处理程序是快速处理程序,快速处理程序被调用时屏蔽所有中断,慢速处理程序不屏蔽;若设置了IRQF_SHARED (老版本中的SA_SHIRQ),则表示多个设备共享中断,若设置了IRQF_SAMPLE_RANDOM(老版本中的SA_SAMPLE_RANDOM),表示对系统熵有贡献,对系统获取随机数有好处。

(这几个flag 是可以通过或的方式同时使用的)devname 设置中断名称,在cat /proc/interrupts 中可以看到此名称。

为注册的驱动程序的设备名。

dev_id 在中断共享时会用到。

一般设置为这个设备的device 结构本身或者NULL。

中断处理程序可以用dev_id 找到相应的控制这个中断的设备,或者用irq2dev_map 找到中断对应的设备。

第三套 嵌入式软件工程师考试试习题_B卷

第三套 嵌入式软件工程师考试试习题_B卷

精心整理 嵌入式Linux 软件工程师认证考试B 卷(考试时间120分钟) 题号一 二 三 四 总分 分数一、选择题(本大题共20个小题,每小题1分,共20分)得分 评阅人1、在下列ARM 处理器的各种模式中,()模式有自己独立的R8-R14寄存器。

A 、系统模式(System)、B 、终止模式(Abort)C 、中断模式(IRQ)D 、快中断模式(FIQ)2、按照ARM 过程调用标准(APCS ),栈指针使用()寄存器,A 、R0B 、R13C 、R14D 、R153、在ARM 体系结构中,()寄存器作为连接寄存器,当进入子程序时或者处理器响应异常的时候,用来保存PC 的返回值;()寄存器作为处理器的程序计数器指针。

A 、R0,R14B 、R13,R15C 、R14,R15D 、R14,R04、在ARM 体系结构中,要从主动用户模式(User )切换到超级用户模式(Supervisor ),应采用何种方法?()A 、直接修改CPU 状态寄存器(CPSR )对应的模式B 、先修改程序状态备份寄存器(SPSR )到对应的模式,再更新CPU 状态C 、使用软件中断指令(SWI )D 、让处理器执行未定义指令5、下面关于MMU 和Linux 描述错误的是:()A 、MMU 是内存管理单元MemoryManagementUnit 的缩写B 、uClinux 可以运行在有MMU 的处理器上C 、Linux 内核功能强大,内存管理功能丰富,即使在没有MMU 的处理器上,也可以通过软件实现地址映射。

D 、Linux 系统正是利用MMU ,才能使得各个进程有独立的寻址空间 6、DNS 域名系统主要负责主机名和()之间的解析。

A 、IP 地址 B 、MAC 地址C 、网络地址 D 、主机别名 7、在vi 编辑器中的命令模式下,重复上一次对编辑的文本进行的操作,可使用()命令。

A 、上箭头 B 、下箭头C 、<.> D 、<*>8、进程有三种状态:()。

Linux 的异常处理

Linux 的异常处理
Linux 由此进入正常的运行状态,之后一段程序(用户空间的或者内核空间的)将一直 在 CPU 上执行,直到程序执行结束或发生任何 Exception。发生 Exception 时,CPU 自动进入 内核态(ARM 的 SVC 态),根据发生的 Exception 类型的不同,linux 内核将可能处理外设 IO、 切换进程、管理内存分配、提供系统服务等一系列操作。所以 Linux 的动态运行可以认为完 全是由 Exception 事件驱动的。
.endm
name:要生成的 vector_xxx 中的 xxx,比如 vector_stub irq, IRQ_MODE, 4,生成 vector_irq, 即 Exception 向量中 IRQ 对应的跳转地址。
mode:设定 CPU 模式位(CPSR 的 M[4:0]),从而可以操作对应模式的特殊寄存器。
图中显示,所有 7 种类型的 Exception 的跳转地址按顺序从基地址开始排列,被称
为 Exception 向 量 。 ARMv6 支 持 两 种 基 地 址 ( Normal:0x00000000,High vector:0xFFFF0000),具体使用哪个基地址,由 ARMv6 内部的 Control Register 的 bit13(V bit)设定。Linux 使用 High vector,需要注意的是,Exception 向量地址也是 虚拟地址(如果使用了虚拟地址机制)。
bl trace_hardirqs_off
#endif
get_thread_info tsk
#ifdef CONFIG_PREEMPT
ldr r8, [tsk, #TI_PREEMPT] @ get preempt count
add r7, r8, #1

ARM的异常处理学习笔记转贴

ARM的异常处理学习笔记转贴

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. 软件中断软件中断是由软件程序主动触发的一种中断事件,也称为系统调用。

软件中断通常由用户态程序调用系统库函数来完成,通过系统调用指令将自己的执行权限转交给操作系统,由操作系统代为执行相应的操作。

常见的软件中断包括文件读写操作、进程创建与销毁等系统调用。

中断处理机制的优点在于能够及时响应外部设备和软件程序的请求,提高了系统的实时性和处理能力。

同时,使用中断处理机制可以实现很多复杂的功能,比如多任务处理、设备驱动程序等。

二、异常处理机制异常是指在程序执行过程中出现的一种非正常情况,例如非法指令、除数为零等。

异常处理机制能够捕捉这些异常事件并进行相应的处理。

异常处理机制主要分为硬件异常和软件异常两类。

1. 硬件异常硬件异常指的是由硬件设备产生的异常事件,如页错误、越界访问等。

当硬件设备检测到异常事件后,会向处理器发送一个异常信号,处理器会中断当前任务的执行,并把当前的上下文信息保存起来,然后转入异常处理程序去处理异常事件。

linux中断处理流程

linux中断处理流程

linux中断处理流程Linux中断处理流程Linux中断处理是操作系统中的一个重要组成部分,用于响应硬件设备的事件。

在Linux中,中断可以是外部中断,如硬件设备发送的中断信号,也可以是内部中断,如软件产生的异常或系统调用。

中断处理的目的是及时响应硬件设备的事件,并采取相应的措施来处理这些事件。

一、中断的触发中断是由硬件设备发送的一个信号,用于通知操作系统某个事件的发生。

这个信号可以是一个电平的变化,一个特定的数据包,或者一个指定的硬件寄存器的变化。

当硬件设备检测到某个事件发生时,它会向处理器发送一个中断信号,处理器会立即停止当前正在执行的任务,保存当前的上下文,并跳转到中断处理程序的入口点。

二、中断处理程序的执行中断处理程序是一个特殊的函数,负责处理中断事件。

当中断发生时,处理器会跳转到中断处理程序的入口点,并执行相应的代码。

中断处理程序的执行过程可以分为以下几个步骤:1. 保存上下文:在执行中断处理程序之前,处理器需要保存当前任务的上下文,包括程序计数器、寄存器和堆栈指针等。

这样可以确保在中断处理程序执行完成后,能够正确地返回到原来的任务。

2. 中断处理程序的执行:一旦保存了上下文,处理器就会执行中断处理程序的代码。

中断处理程序根据中断的类型,执行相应的操作。

例如,对于外部中断,中断处理程序可能需要读取硬件设备的状态,处理数据包或执行特定的操作。

对于内部中断,中断处理程序可能需要处理异常或系统调用。

3. 中断处理程序的结束:当中断处理程序执行完成后,处理器会恢复之前保存的上下文,并将控制权返回给原来的任务。

这样原来的任务就可以继续执行,而不会受到中断的影响。

三、中断处理的优先级在Linux中,中断处理有不同的优先级。

这是为了确保对于紧急事件的及时处理。

中断的优先级由硬件设备决定,通常是通过一个优先级编码器来实现的。

当多个中断同时发生时,处理器会按照优先级的顺序来处理中断。

高优先级的中断会立即被处理,而低优先级的中断则会被推迟到稍后处理。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于ARM Linux 中断、异常的处理分析本文是基于ARM S3C2410X系统的Linux 2.6中断、异常和系统调用的处理分析。

主要有以下几个部分:1.ARM的硬件中断机制2.Linux 2.6对ARM中断向量表的初始化3.Linux 2.6对ARM中断、异常的处理(从汇编-->C语言函数;asm_do_IRQ)一、ARM的硬件中断机制1、中断的基本概念在嵌入式系统中外部设备的功能实现主要是依靠中断机制来实现的,即将设备功能程序的实现以中断服务子程序的形式进行组织。

中断(interrupt)通常被定义为一个事件,该事件改变处理器执行的指令顺序。

这样的事件与CPU芯片外部硬件电路产生的电信号相对应。

中断的产生每个能够发出中断请求的硬件设备控制器都有一条称为IRQ(Interrupt ReQuest)的输出线。

所有的IRQ线都与一个中断控制器的输入引脚相连,中断控制器与CPU的INTR引脚相连。

设备设备控制器中断控制器IRQCPUINTR中断向量每个中断和异常由0~255之间的一个数(8位)来标识,Intel称其为中断向量。

中断描述符表(Interrupt Descriptor Table ,IDT)是一个系统表,它与每一个中断或异常向量相联系,每一个向量在表中有相应的中断或异常处理程序的入口地址。

内核在允许中断发生前,必须适当地初始化IDT。

表中的每一项对应一个中断或异常向量,每个向量由8个字节组成。

因此,最多需要256*8=2048字节来存放IDT。

CPU的idtr寄存器指向IDT表的物理基地址。

2、中断和异常的硬件处理在内核被Init进程初始化后,CPU运行在保护模式下。

当执行了一条指令后,cs和eip这对寄存器包含了下一条将要执行的指令的逻辑地址。

在执行这条指令之前,CPU控制单元会检查在运行前一条指令时是否发生了一个中断或者异常。

如果发生了一个中断或异常,那么CPU控制单元执行下列操作:(1) 确定与中断或者异常关联的向量i(0~255)。

(2) 读由idtr寄存器指向的IDT表中的第i项。

(3) 从gdtr寄存器获得GDT的基地址,并在GDT中查找,以读取IDT表项中的选择符所标识的段描述符,这个描述符指定中断或异常处理程序所在段的基地址。

(4) 确定中断是由授权的发生源发出的。

中断:中断处理程序的特权不能低于引起中断的程序的特权(当前特权级CPL —对应CS寄存器中的低两位其值应该小于段描述符—对应GDT表项中的描述符特权级DPL,特权级高于DPL,即当前代码是能够访问相应的段的,产生一个“General protection”异常);编程异常:还需进一步比较CPL与对应IDT表项中的门描述符的DPL。

即当CPL的特权级高于GDT表项中的描述符特权级DPL,但低于IDT表项中的门描述符的DPL,就是异常。

(5) 检查是否发生了特权级的变化,一般指是否由用户态陷入了内核态。

也就是说CPL是否不同于所选择的段描述符的DPL,如果是,控制单元必须开始使用与新的特权级相关的堆栈,通过以下操作来做到这点:A、读tr寄存器,访问运行进程的TSS段;B、用与新特权级相关的栈段和栈指针装载ss和esp寄存器。

这些值可以在进程的TSS段中找到;C、在新的栈中保存ss和esp以前的值,这些值指明了与旧特权级相关的栈的逻辑地址。

(6) 若发生的是故障,用引起异常的指令地址修改cs和eip寄存器的值,以使得这条指令在异常处理结束后能被再次执行。

(7) 在栈中保存eflags、cs和eip的内容。

(8) 如果异常产生一个硬件出错码,则将它保存在栈中。

(9) 装载cs和eip寄存器,其值分别是IDT表中第i项门描述符的段选择符和偏移量字段。

这对寄存器的值指出中断或者异常处理程序的第一条指令的逻辑地址。

控制单元所执行的最后一步就是跳转到中断或异常处理程序,换句话说,处理完中断信号后,控制单元所执行的指令就是被选中处理程序的第一条指令。

中断/异常处理完后,相应的处理程序会执行一条iret汇编指令,把控制权转交给被中断的进程,这条汇编指令让CPU控制单元做如下事情:(1) 用保存在栈中的值装载cs、eip和eflags寄存器。

如果一个硬件出错码曾被压入栈中,并且在eip内容的上面,那么执行iret指令前必先弹出这个硬件出错码。

(2) 检查处理程序的特权级CPL是否等于cs中最低两位的值(这意味着进程在被中断的时候是运行在内核态还是用户态,即被中断的进程与处理程序是否运行在同一特权级)。

若是,iret终止执行;否则,转入下一步。

(3) 从栈中装载ss和esp寄存器。

这步意味着返回到与旧特权级相关的栈。

(4) 检查ds、es、fs和gs段寄存器的内容,如果其中一个寄存器包含的选择符是一个段描述符,并且特权级比当前特权级高(DPL的值小于CPL的值),则清除相应的寄存器。

控制单元这么做是防止怀有恶意的用户程序利用内核以前所用的寄存器访问内核空间。

二、Linux对ARM中断向量表的初始化1、中断向量表的作用如上在中断的硬件处理的分析中可知:中断首先是一个硬件行为,而处理中断呢,显然又是一个软件行为,那么当硬件触发中断的时候,怎么调用到中断处理函数的呢?要搞清楚这个问题,就要搞清楚发生中断的时候 CPU做了什么。

以S3C2410X系统的异常中断为例:S3C2410X是基于ARM920T内核处理器。

该系统提供的FIQ和IRQ异常中断用于外部设备向CPU请求服务,一般情况下都是采用IRQ。

S3C2410X系统中通常在存储区的低端固化了一个32字节的硬件中断向量表,用来指定各异常中断与其处理程序的对应关系。

CPU知道一个source触发了中断,怎么调用执行一些函数(汇编,或者c语言),就是靠异常向量表(事实上,exception vector table 也是由汇编组成的)异常 模式向量表偏移复位(reset)SVC+0x00未定义指令UND+0x04软件中断(SWI)SVC+0x08预取指终止ABT+0x0c数据终止ABT+0x10未分配--+0x14IRQ IRQ+0x18FIQ FIQ+0x1carm异常表,对应模式及向量表偏移(摘自arm体系结构与编程一书)当一个异常/中断出现后, S3C2410X系统中ARM处理器对其的响应过程如下: (1) 保存处理器当前状态、中断屏蔽位以及各条件标志位。

将当前程序状态寄存器CPSR的内容保存到将要执行的异常中断对应的SPSR寄存器中。

(2) 设置当前程序状态寄存器CPSR中相应的位。

包括设置CPSR中的位,使处理器进入相应的执行模式;设置CPSR中的位,禁止IRQ中断,当进入FIQ 模式时,禁止FIQ中断。

(3) 将寄存器lr_mode设置成返回地址。

(4) 将程序计数器值(PC),设置成该异常中断的中断向量地址,从而跳转到相应的异常中断处理程序执行。

即处理器跳转到异常向量表中相应的入口(对于IRQ ,显然pc=0x18)。

所以当触发IRQ后,CPU会最后跳入0x18 这个入口,定制kernel时只需在这个入口填入自己的指令(当然是汇编语句),即可调用中断处理函数,可能这样:触发IRQ—CPU jump 到0x18,同时要把irqno传入相应的寄存器调用一个中断通用处理函数如:asm_do_IRQ(unsigned int irqno) asm_do_IRQ() 这个函数根据irqno 就可以找到对应的中断描述符,然后调用中断描述符里面的handler()了。

2、中断向量表的初始化arch/arm/kernel/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_offset.globl __vectors_end__vectors_end:ARM linux内核启动时,通过start_kernel()->trap_init()的调用关系,初始化内核的中断异常向量表。

linux/init/main.c Start_kernel中的中断向量表初始化asmlinkage void __init start_kernel(void){.....trap_init();init_IRQ();....中断的初始化主要和这两个函数相关(1) trap_init()linux/arch/arm/kernel/traps.cvoid __init trap_init(void){unsigned long vectors = CONFIG_VECTORS_BASE;extern char __stubs_start[], __stubs_end[];extern char __vectors_start[], __vectors_end[];extern char __kuser_helper_start[], __kuser_helper_end[];int kuser_sz = __kuser_helper_end - __kuser_helper_start;/** Copy the vectors, stubs and kuser helpers (in entry-armv.S)* into the vector page, mapped at 0xffff0000, and ensure these* are visible to the instruction stream.*/memcpy((void *)vectors, __vectors_start, __vectors_end - __vectors_start);memcpy((void *)vectors + 0x200, __stubs_start, __stubs_end - __stubs_start);memcpy((void *)vectors + 0x1000 - kuser_sz, __kuser_helper_start, kuser_sz);/** Copy signal return handlers into the vector page, and* set sigreturn to be a pointer to these.*/memcpy((void *)KERN_SIGRETURN_CODE, sigreturn_codes,sizeof(sigreturn_codes));flush_icache_range(vectors, vectors + PAGE_SIZE);modify_domain(DOMAIN_USER, DOMAIN_CLIENT);}CONFIG_VECTORS_BASE是一个宏,用来获取ARM异常向量的地址,该宏在include/arch/asm-arm/system.h中定义:include/arch/asm-arm/system.h#define CPU_ARCH_ARMv5 4#define CR_V (1 << 13) /* Vectors relocated to 0xffff0000 */extern unsigned long cr_no_alignment; /* defined in entry-armv.S */extern unsigned long cr_alignment; /* defined in entry-armv.S */#if __LINUX_ARM_ARCH__ >= 4#define vectors_high() (cr_alignment & CR_V)#else#define vectors_high() (0)#endif对于ARMv4以下的版本,这个地址固定为0;ARMv4及其以上的版本,ARM异常向量表的地址受协处理器CP15的c1寄存器(control register)中V位(bit[13])的控制,如果V=1,则异常向量表的地址为0x00000000~0x0000001C;如果V=0,则为:0xffff0000~0xffff001C。

相关文档
最新文档