ARM_Linux_中断异常的处理分析
- 格式:pdf
- 大小:152.84 KB
- 文档页数:19
单片机的中断与异常处理方法在单片机的工作过程中,中断和异常处理是非常重要的概念和方法。
它们能够有效地提高单片机的响应能力和灵活性,使其能够应对各种不同的工作需求和问题。
本文将介绍单片机中断的概念、中断的种类以及针对不同中断的处理方法,同时也会探讨单片机异常处理的原理和方法。
一、中断的概念和种类中断是指在一个程序执行的过程中,由于某种特殊的事件发生,导致程序的正常执行被打断,转而去执行一个与当前任务无关的子程序,完成该事件的相应处理。
中断可以分为外部中断和内部中断两种。
1. 外部中断外部中断是指当单片机外部引脚的电平或信号发生变化时,引发中断事件,使单片机停止当前任务的执行,去处理由该外部事件引发的中断服务程序(ISR)。
外部中断常用于与外部设备的交互,如按键输入、传感器检测等。
在编程中,我们可以通过设置中断触发条件和编写相应的中断服务程序来实现对外部中断的处理。
2. 内部中断内部中断是指当单片机内部某个特定的事件发生时,由硬件或软件触发中断请求,并且将控制权交给中断服务程序进行相应的处理。
内部中断的发生可以是由于某个特定条件的满足,如定时器溢出中断、串口接收中断等;也可以是由软件的运行结果触发,如除法溢出中断、地址错误中断等。
不同的内部中断需要通过编程实现相应的中断服务程序。
二、中断的处理方法中断处理是指在中断发生时,单片机通过中断向量表找到相应的中断服务程序,并对中断事件进行处理的过程。
下面将介绍两种常用的中断处理方法。
1. 优先级中断处理优先级中断处理是指对多个中断源按照优先级进行划分和处理的方法。
在单片机的中断系统中,每个中断源都被赋予了一个优先级,高优先级的中断可以打断当前正在执行的低优先级中断,从而增加了中断的响应速度和灵活性。
优先级中断处理需要在编程时设置中断的优先级,并根据不同的中断事件编写相应的中断服务程序。
2. 嵌套中断处理嵌套中断处理是指当一个中断正在执行的过程中,又发生了另一个中断时,将当前中断挂起,转而处理新发生的中断,并在处理完毕后返回原中断继续执行的方法。
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 找到中断对应的设备。
精心整理 嵌入式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、进程有三种状态:()。
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中,中断可以是外部中断,如硬件设备发送的中断信号,也可以是内部中断,如软件产生的异常或系统调用。
中断处理的目的是及时响应硬件设备的事件,并采取相应的措施来处理这些事件。
一、中断的触发中断是由硬件设备发送的一个信号,用于通知操作系统某个事件的发生。
这个信号可以是一个电平的变化,一个特定的数据包,或者一个指定的硬件寄存器的变化。
当硬件设备检测到某个事件发生时,它会向处理器发送一个中断信号,处理器会立即停止当前正在执行的任务,保存当前的上下文,并跳转到中断处理程序的入口点。
二、中断处理程序的执行中断处理程序是一个特殊的函数,负责处理中断事件。
当中断发生时,处理器会跳转到中断处理程序的入口点,并执行相应的代码。
中断处理程序的执行过程可以分为以下几个步骤:1. 保存上下文:在执行中断处理程序之前,处理器需要保存当前任务的上下文,包括程序计数器、寄存器和堆栈指针等。
这样可以确保在中断处理程序执行完成后,能够正确地返回到原来的任务。
2. 中断处理程序的执行:一旦保存了上下文,处理器就会执行中断处理程序的代码。
中断处理程序根据中断的类型,执行相应的操作。
例如,对于外部中断,中断处理程序可能需要读取硬件设备的状态,处理数据包或执行特定的操作。
对于内部中断,中断处理程序可能需要处理异常或系统调用。
3. 中断处理程序的结束:当中断处理程序执行完成后,处理器会恢复之前保存的上下文,并将控制权返回给原来的任务。
这样原来的任务就可以继续执行,而不会受到中断的影响。
三、中断处理的优先级在Linux中,中断处理有不同的优先级。
这是为了确保对于紧急事件的及时处理。
中断的优先级由硬件设备决定,通常是通过一个优先级编码器来实现的。
当多个中断同时发生时,处理器会按照优先级的顺序来处理中断。
高优先级的中断会立即被处理,而低优先级的中断则会被推迟到稍后处理。
linux异常处理流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!1. 异常发生:当程序执行过程中遇到异常情况时,例如除数为 0、内存访问错误、文件不存在等,异常会被触发。
Linux下的段错误(Segment ationfault)产生的原因及调试方法(经典)2009-04-05 11:25简而言之,产生段错误就是访问了错误的内存段,一般是你没有权限,或者根本就不存在对应的物理内存,尤其常见的是访问0地址.一般来说,段错误就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gdtr来保存的,他是一个48位的寄存器,其中的32位是保存由它指向的gdt表,后13位保存相应于gdt的下标,最后3位包括了程序是否在内存中以及程序的在cpu中的运行级别,指向的gdt是由以64位为一个单位的表,在这张表中就保存着程序运行的代码段以及数据段的起始地址以及与此相应的段限和页面交换还有程序运行级别还有内存粒度等等的信息。
一旦一个程序发生了越界访问,cpu就会产生相应的异常保护,于是segme ntatio n fault就出现了.在编程中以下几类做法容易导致段错误,基本是是错误地使用指针引起的1)访问系统数据区,尤其是往系统保护的内存地址写数据最常见就是给一个指针以0地址2)内存越界(数组越界,变量类型不一致等) 访问到不属于你的内存区域解决方法我们在用C/C++语言写程序的时侯,内存管理的绝大部分工作都是需要我们来做的。
实际上,内存管理是一个比较繁琐的工作,无论你多高明,经验多丰富,难免会在此处犯些小错误,而通常这些错误又是那么的浅显而易于消除。
但是手工“除虫”(debug),往往是效率低下且让人厌烦的,本文将就"段错误"这个内存访问越界的错误谈谈如何快速定位这些"段错误"的语句。
下面将就以下的一个存在段错误的程序介绍几种调试方法:1 dummy_f unctio n (void)2 {3 unsigne d char *ptr = 0x00;4 *ptr = 0x00;5 }67 int main (void)8 {9 dummy_f unctio n ();1011 return0;12 }作为一个熟练的C/C++程序员,以上代码的bu g应该是很清楚的,因为它尝试操作地址为0的内存区域,而这个内存区域通常是不可访问的禁区,当然就会出错了。
ARM处理器中断处理的编程实现中断是指外部事件打断正在执行的程序,并暂时转去执行与该事件有关的处理程序。
在ARM处理器上,中断处理是通过中断向量表和中断服务程序来实现的。
下面是ARM处理器中断处理的编程实现的主要内容。
1.中断向量表的设置在ARM处理器中,中断向量表是一个保存中断服务程序地址的表。
每个中断号对应一个中断服务程序的地址,当发生中断时,处理器会跳转到相应中断号对应的中断服务程序。
中断向量表必须存储在内存中,并且要先设置好才能使得中断处理正常工作。
为了设置中断向量表,需要将每个中断号对应的中断服务程序的地址写入到相应的中断向量表项中。
具体的实现方式根据不同的ARM架构有所不同。
以ARM Cortex-M系列处理器为例,中断向量表的每个向量表项占用4个字节,存储中断服务程序的地址。
下面是使用C语言设置中断向量表的示例代码:```c//声明中断向量表typedef void (*interrupt_handler_t)(void);//中断服务程序声明void interrupt_handler1(void);void interrupt_handler2(void);...//中断向量表__attribute__ ((section(".isr_vector")))const interrupt_handler_t interrupt_vector_table[] =interrupt_handler1, // 中断号0对应的中断服务程序interrupt_handler2, // 中断号1对应的中断服务程序...```2.中断服务程序的编写中断服务程序负责处理中断的具体逻辑。
当中断发生时,处理器会跳转到对应中断号的中断服务程序进行处理。
中断服务程序必须具有固定的格式和规范,以确保在中断发生时能正常执行。
中断服务程序的编写一般包括以下几个步骤:-保存寄存器状态:由于中断服务程序会暂时打断正在执行的程序,需要在进入中断服务程序时保存当前的寄存器状态,以便中断处理完成后能够正确恢复现场。
述嵌入式系统的定义。
嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。
1-2.简述嵌入式系统的组成。
从体系结构上看,嵌入式系统主要由嵌入式处理器、支撑硬件和嵌入式软件组成。
其中嵌入式处理器通常是单片机或微控制器,支撑硬件主要包括存储介质、通信部件和显示部件等,嵌入式软件则包括支撑硬件的驱动程序、操作系统、支撑软件及应用中间件等。
嵌入式系统的组成部分是嵌入式系统硬件平台、嵌入式操作系统和嵌入式系统应用。
嵌入式系统硬件平台为各种嵌入式器件、设备(如ARM、Power PC、Xscale、MIPS 等);嵌入式操作系统是指在嵌入式Linux、u CLinux、Win CE 等。
ARM7与ARM9的区别1-3.ARM7处理器使用的是(ARMv4)指令集。
ARM7 内核采用冯·诺依曼体系结构,数据和指令使用同一条总线。
内核有一条3级流水线,执行ARMv4 指令集。
1-6.ARM9采用的是(5)级流水线设计。
存储器系统根据哈佛体系结构(程序和数据空间独立的体系结构)重新设计,区分数据总线和指令总线内存管理单元MMU定义:提供专门负责存储管理的部件。
作用:实现地址映射;对地址访问进行保护和限制ARM核有多少个寄存器?ARM处理器有37个32位长的寄存器;(1)30个通用寄存器;(2)6个状态寄存器(3)1个pc2、ARM处理器:ARM处理器是英国ARM(Advanced RISC Machines)公司设计的全球领先的16/32位RISC微处理器,ARM公司通过转让RISC微处理器,外围和系统芯片设计技术给合作伙伴,使他们能用这些技术来生产各具特色的芯片。
4、异常:当正常的程序执行流程发生暂时的停止时,称之为异常,例如处理一个外部的中断请求。
6、ARM微处理器内核是如何进行异常处理的?答:1)当异常产生时,ARM内核拷贝CPSR到SPSR_<mode>,设置适当的CPSR位:改变处理器状态进入ARM态,改变处理器模式进入相应的异常模式,设置中断禁止位禁止相应中断(如果需要);保存返回地址到LR_<mode>,设置PC为相应的异常向量。
中断异常处理流程
中断异常处理涉及到硬件和软件两个层面。
在硬件层面,中断是由外
部设备或者操作系统内部生成的,比如键盘输入、计时器到期、网络数据
到达等;在软件层面,中断是由操作系统内核监控到的,并依照一定的优
先级进行处理。
1.中断请求发生:当外部设备发出中断信号时,中断控制器将这个信
号发送给系统处理器,或者系统内部的一些模块发生异常,也会发出中断
信号。
2.中断向量表:系统处理器在接收到中断信号后,首先会查询中断向
量表,确定这个中断的类型和优先级。
中断向量表是由操作系统预先构建的,其中记录了各个中断类型的处理程序入口地址。
3.中断处理程序:系统处理器根据中断向量表中的入口地址,跳转到
相应的中断处理程序中。
中断处理程序是由操作系统或其他软件所提供的,用于处理不同类型的中断。
简述arm处理器异常处理过程ARM处理器是一种常用的嵌入式处理器架构,广泛应用于移动设备、嵌入式系统和物联网等领域。
在ARM处理器的运行过程中,会出现各种异常情况,如硬件故障、软件错误等。
为了保证系统的稳定性和可靠性,ARM处理器采用了异常处理机制来处理这些异常情况。
ARM处理器的异常处理过程可以分为两个阶段:异常发生阶段和异常处理阶段。
异常发生阶段是指异常事件发生时的处理过程,而异常处理阶段是指异常事件被捕获后的处理过程。
在异常发生阶段,ARM处理器会首先检测到异常事件的发生,并保存当前的处理状态。
然后,根据异常事件的类型,ARM处理器会进入相应的异常处理程序。
ARM处理器支持的异常类型包括中断、数据终止、指令终止、外部中断等。
每种异常类型都有对应的异常处理程序。
在异常处理阶段,ARM处理器会根据异常事件的类型执行相应的异常处理程序。
异常处理程序的执行过程包括以下几个步骤:首先,ARM处理器会保存当前的处理状态,包括程序计数器、寄存器等。
然后,ARM处理器会根据异常事件的类型执行相应的异常处理代码。
异常处理代码可以是硬件中断处理程序、软件异常处理程序或操作系统内核的异常处理程序等。
在执行异常处理代码时,ARM处理器会根据异常事件的优先级进行中断屏蔽,以保证异常处理的顺序和可靠性。
最后,ARM处理器会恢复保存的处理状态,并继续执行异常处理之前的程序。
在异常处理过程中,ARM处理器还提供了一些特殊的异常处理指令,用于处理特定的异常情况。
例如,ARM处理器提供了异常返回指令,用于从异常处理程序返回到之前的程序。
此外,ARM处理器还提供了一些特殊的异常处理寄存器,用于保存异常处理过程中的状态信息。
ARM处理器的异常处理过程是一个复杂而精细的机制,能够有效地处理各种异常情况。
通过异常处理机制,ARM处理器可以保证系统的稳定性和可靠性,提高系统的容错能力和可维护性。
同时,ARM 处理器的异常处理机制也为开发者提供了一种方便和灵活的异常处理方式,可以根据实际需求进行异常处理程序的编写和调试。
ARM中断程序的原理和实现中断是计算机系统中的一种强制性事件,它能够暂停正在执行的程序,并立即转移到一个特殊的处理程序上去执行。
ARM架构的处理器也支持中断机制,为了正确处理中断,ARM定义了一套中断处理的规范和流程。
本文将介绍ARM中断的原理和实现。
一、ARM中断的原理1. 中断请求(Interrupt Request, IRQ):外部设备或其它条件触发的一种中断请求信号,用于向处理器报告需要进行中断处理的事件。
2. 中断服务例程(Interrupt Service Routine,ISR):是一段特殊的程序代码,用于处理中断事件。
当中断被触发后,处理器会跳转到对应的中断服务例程中执行,完成相应的中断处理逻辑。
3. 中断控制器(Interrupt Controller):负责接收处理器的中断请求,并将其派发给对应的中断服务例程。
1.外设或其它条件触发中断请求,发送中断信号给中断控制器。
2.中断控制器接收到中断请求后,对中断请求进行优先级判断,确定哪个中断请求最先被处理。
3.中断控制器将中断请求发送给处理器,并将处理器的执行流转移到中断服务例程上。
4.处理器执行中断服务例程,处理相应的中断事件。
5.中断服务例程执行完毕后,处理器返回到中断发生前的状态,继续执行原程序。
二、ARM中断的实现1.配置中断控制器ARM架构提供了多种中断控制器,如VIC(Vectored Interrupt Controller)和GIC(Generic Interrupt Controller)等。
具体的中断控制器的选择和配置方式根据具体的处理器和系统架构而定。
配置中断控制器的基本步骤如下:(1)开启中断:通过设置相关的寄存器,使能中断功能。
(2)配置中断优先级:对不同中断请求进行优先级的设置,确保高优先级的中断能够被及时处理。
(3)分配中断服务例程:将不同的中断请求与相应的中断服务例程关联起来,当中断请求触发时,中断服务例程能够被正确执行。
ARM处理器中有7种异常情况:
快速中断请求,中断请求,预取指中止,数据中止,软件中断,未定义指令,复位
快速中断请求异常进入快中断模式,支持高速数传输及通道处理(FIQ异常响应时进入此模式)
中断请求异常进入中断模式,用于通用中断处理,(IRQ异常响应时进入此模式)
预取指中止,数据中止异常进入中止模式,用于支持虚拟内存和/或存储器保护
未定义指令异常进入未定义模式,支持硬件协处理器的软件仿真(未定义指令异常响应时进入此模式)
软件中断,复位异常进入管理模式,操作系统保护代码(系统复位和软件中断响应时进入此模式)
CPRS的I位为中断禁止位,F位为快中断禁止位。
中断异常处理流程1.特殊中断响应与返回系统运行时,特殊可能会随时发生。
当一个特殊出现以后,ARM微处理器会执行下列几步操作:1) 将下一条指令的地址存入相应连接寄存器LR,以便程序在处理特殊返回时能从正确的位置重新开始执行。
2) 将CPSR复制到相应的SPSR中。
3) 根据特殊类型,强制设置CPSR的运行模式位。
4) 强制PC从有关的特殊向量地址取下一条指令执行,从而跳转到相应的特殊处理程序处。
这些工作是由ARM 内核完成的,不需要用户程序参与。
特殊处理完毕之后,ARM 微处理器会执行下列几步操作从特殊返回:1) 将连接寄存器LR的值减去相应的偏移量后送到PC中。
2) 将SPSR复制回CPSR中。
3) 若在进入特殊处理时设置了中断禁止位,要在此清除。
这些工作务必由用户在中断处理函数中实现。
为保证在ARM处理器发生特殊时不至于处于未知状态,在应用程序的设计中,首先要进行特殊处理。
使用的方式是在特殊向量表中的特定位置放置一条跳转指令,跳转到特殊处理程序。
当ARM处理器发生特殊时,程序计数器PC会被强制设置为对应的特殊向量,从而跳转到特殊处理程序。
当特殊处理完成以后,返回到主程序继续执行。
能够认为应用程序总是从复位特殊处理程序开始执行的,因此复位特殊处理程序不需要返回。
2.特殊处理程序设计2.1 特殊响应流程由于向量表的限制,只能有一条指令B完成32MB范围内的跳转,并不能保证所有的特殊处理函数都位于32MB范围内。
为了扩展跳转范围,需要二次跳转才能把特殊处理函数的地址传送给PC。
特殊处理调用关系如图1所示。
三星公司网站提供了test2410_r11软件包,其中2410init.s有如下代码:HandlerXXXsub sp,sp,#4 ;减少sp,储存跳转地址stmfd sp!,{r0} ;将工作寄存器压入堆栈ldr r0,=HandleXXX ;将HandleXXX地址放入r0ldr r0,[r0] ;将中断程序入口地址放入r0str r0,[sp,#4] ;将中断程序入口地址压入堆栈ldmfd sp!,{r0,pc} ;将工作寄存器与中断程序入口地址弹出到r0与PC图1特殊处理调用同时在RAM中定义了存有中断程序入口地址表_ISR_STARTADDRESS:AREA RamData, DA TA, READWRITE^ _ISR_STARTADDRESSHandleReset # 4HandleUndef # 4HandleSWI # 4HandlePabort # 4HandleDabort # 4HandleReserved # 4HandleIRQ # 4HandleFIQ # 4通常HandlerXXX位于程序入口地址32MB范围内,HandleXXX是以_ISR_STARTADDRESS为基地址的RAM中地址。
基于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。