arm11处理器裸机的异常与中断处理参考:

【OK6410裸机程序】异常处理

【OK6410裸机程序】按键中断

另外参考一篇:Linux中断体系结构

在ARM V4及V4T以后的大部分处理器中,中断向量表的位置可以有两个位置:一个是0,另一个是0xffff0000。可以通过CP15协处理器c1寄存器中V位(bit[13])控制。V和中断向量表的对应关系如下:  [V=0]0x00000000~0x0000001C /[V=1]0xffff0000~0xffff001C  。Linux内核使用0xffff0000。

异常向量的代码很简单,只是一些跳转指令。发生异常时,cpu自动执行这些指令,跳转到更复杂得代码。

地址__vectors_start~__vectors_end间的代码就是异常向量,在arch/arm/kernel/entry-armv.S中定义,这些异常向量会被复制到0xffff0000处。

    .globl    __vectors_start
__vectors_start:
swi SYS_ERROR0 //复位时,cpu将执行这条指令
b vector_und + stubs_offset //未定义异常时,cpu执行这条指令
ldr pc, .LCvswi + stubs_offset //swi异常
b vector_pabt + stubs_offset //指令预取终止
b vector_dabt + stubs_offset //数据访问终止
b vector_addrexcptn + stubs_offset //没有用到
b vector_irq + stubs_offset //irq异常
b vector_fiq + stubs_offset //fiq异常 .globl __vectors_end
__vectors_end:

“更复杂得代码”在地址__stubs_start~__stubs_end之间,在arch/arm/kernel/entry-armv.S中定义,这些异常向量会被复制到0xffff0200处。

     .globl    __stubs_start
__stubs_start:
/*
* Interrupt dispatcher
*/
vector_stub irq, IRQ_MODE, .long __irq_usr @ (USR_26 / USR_32)
.long __irq_invalid @ (FIQ_26 / FIQ_32)
.long __irq_invalid @ (IRQ_26 / IRQ_32)
.long __irq_svc @ (SVC_26 / SVC_32)
.long __irq_invalid @
.long __irq_invalid @
.long __irq_invalid @
.long __irq_invalid @
.long __irq_invalid @
.long __irq_invalid @
.long __irq_invalid @ a
.long __irq_invalid @ b
.long __irq_invalid @ c
.long __irq_invalid @ d
.long __irq_invalid @ e
.long __irq_invalid @ f /*
* Data abort dispatcher
* Enter in ABT mode, spsr = USR CPSR, lr = USR PC
*/
vector_stub dabt, ABT_MODE, .long __dabt_usr @ (USR_26 / USR_32)
.long __dabt_invalid @ (FIQ_26 / FIQ_32)
.long __dabt_invalid @ (IRQ_26 / IRQ_32)
.long __dabt_svc @ (SVC_26 / SVC_32)
.long __dabt_invalid @
.long __dabt_invalid @
.long __dabt_invalid @
.long __dabt_invalid @
.long __dabt_invalid @
.long __dabt_invalid @
.long __dabt_invalid @ a
.long __dabt_invalid @ b
.long __dabt_invalid @ c
.long __dabt_invalid @ d
.long __dabt_invalid @ e
.long __dabt_invalid @ f /*
* Prefetch abort dispatcher
* Enter in ABT mode, spsr = USR CPSR, lr = USR PC
*/
vector_stub pabt, ABT_MODE, .long __pabt_usr @ (USR_26 / USR_32)
.long __pabt_invalid @ (FIQ_26 / FIQ_32)
.long __pabt_invalid @ (IRQ_26 / IRQ_32)
.long __pabt_svc @ (SVC_26 / SVC_32)
.long __pabt_invalid @
.long __pabt_invalid @
.long __pabt_invalid @
.long __pabt_invalid @
.long __pabt_invalid @
.long __pabt_invalid @
.long __pabt_invalid @ a
.long __pabt_invalid @ b
.long __pabt_invalid @ c
.long __pabt_invalid @ d
.long __pabt_invalid @ e
.long __pabt_invalid @ f /*
* Undef instr entry dispatcher
* Enter in UND mode, spsr = SVC/USR CPSR, lr = SVC/USR PC
*/
vector_stub und, UND_MODE .long __und_usr @ (USR_26 / USR_32)
.long __und_invalid @ (FIQ_26 / FIQ_32)
.long __und_invalid @ (IRQ_26 / IRQ_32)
.long __und_svc @ (SVC_26 / SVC_32)
.long __und_invalid @
.long __und_invalid @
.long __und_invalid @
.long __und_invalid @
.long __und_invalid @
.long __und_invalid @
.long __und_invalid @ a
.long __und_invalid @ b
.long __und_invalid @ c
.long __und_invalid @ d
.long __und_invalid @ e
.long __und_invalid @ f .align /*=============================================================================
* Undefined FIQs
*-----------------------------------------------------------------------------
* Enter in FIQ mode, spsr = ANY CPSR, lr = ANY PC
* MUST PRESERVE SVC SPSR, but need to switch to SVC mode to show our msg.
* Basically to switch modes, we *HAVE* to clobber one register... brain
* damage alert! I don't think that we can execute any code in here in any
* other mode than FIQ... Ok you can switch to another mode, but you can't
* get out of that mode without clobbering one register.
*/
vector_fiq:
disable_fiq
subs pc, lr, # /*=============================================================================
* Address exception handler
*-----------------------------------------------------------------------------
* These aren't too critical.
* (they're not supposed to happen, and won't happen in 32-bit data mode).
*/ vector_addrexcptn:
b vector_addrexcptn /*
* We group all the following data together to optimise
* for CPUs with separate I & D caches.
*/
.align .LCvswi:
.word vector_swi .globl __stubs_end
__stubs_end:

__stubs_start

关于stubs_offset的值及解析,参考Linux异常体系之stubs_offset

关于__stubs_start~__stubs_end之间的代码解析,参考vector_stub宏解析 。vector_irq、 vector_dabt、vector_pabt、vector_und、vector_fiq都在它们中间。

各种异常的C处理函数分为5类,分布在不同的函数中。

1.中断处理C总入口函数asm_do_IRQ,在linux/arch/arm/kernel/irq.c中。它调用其它文件注册的中断处理函数。

init_IRQ函数被用来初始化中断的处理框架,设置各种中断的默认处理函数。当中断发生时,中断总入口函数asm_do_IRQ就可以调用这些函数坐进一步的处理。

b    vector_irq + stubs_offset
-->vector_stub irq, IRQ_MODE,
-->__irq_usr/__irq_svc
-->void __exception asm_do_IRQ(unsigned int irq, struct pt_regs *regs)

2.未定义指令处理C总入口函数do_undefinstr,在linux/arch/arm/kernel/traps.c中。

b    vector_und + stubs_offset
-->vector_stub und, UND_MODE
-->__und_usr/__und_svc
-->b do_undefinstr

3.与内存访问相关的异常处理C总入口函数do_DataAbort,do_PrefechAbort,在linux/arch/arm/kernel/fault.c中。

4.swi异常处理函数,在在linux/arch/arm/kernel/calls.S中。swi异常的处理函数指针被组织成一个表格;swi指令机器码的为[23:0]用来作为索引,通过不同的“swi index”指令可以调用不同的swi异常处理函数,也称为系统调用,比如sys_open、sys_read、sys_write等。

5.没有使用的异常,linux中没有使用FIQ异常。

Linux异常处理体系结构的更多相关文章

  1. 字符设备驱动-------Linux异常处理体系结构

    裸机中断流程 外部触发 CPU 发生中断, 强制的跳到异常向量处 跳转到具体函数 保存被中断处的现场(各种寄存器的值) 执行中断处理函数,处理具体任务 恢复被中断的现场 Linux处理异常流程 异常发 ...

  2. Linux内核异常处理体系结构详解(一)【转】

    转自:http://www.techbulo.com/1841.html 2015年11月30日 ⁄ 基础知识 ⁄ 共 6653字 ⁄ 字号 小 中 大 ⁄ Linux内核异常处理体系结构详解(一)已 ...

  3. Linux计时体系结构

    [Linux操作系统分析]定时测量——RTC,TSC,PIT,jiffies,计时体系结构,延迟函数   1 基本概念 定时机制连同一些更可见的内核活动(如检查超时)来驱使进程切换. 两种主要的定时测 ...

  4. linux异常处理:selinux配置错误导致无法重启

    点击返回自学Linux集锦 linux异常处理:selinux配置错误导致无法重启 一次linux无法重启异常记录: 当时第一反应就是梳理最近的配置变更,特别是能预知相关的就是selinux配置变更. ...

  5. 字符设备驱动笔记——中断方式按键驱动之linux异常处理结构(四)

    .中断方式获取按键值 单片机: )按键按下 )cup发生中断,跳转到异常向量入口执行 )b 函数 a.保存被中断的现场 b.执行中断处理函数 c.恢复 linux: )trap_init()函数构造异 ...

  6. Linux驱动之异常处理体系结构简析

    异常的概念在单片机中也接触过,它的意思是让CPU可以暂停当前的事情,跳到异常处理程序去执行.以前写单片机裸机程序属于前后台程序,前台指的就是mian函数里的while(1)大循环,后台指的就是产生异常 ...

  7. linux文件系统体系结构 和 虚拟文件系统(VFS)

    图 1. Linux 文件系统组件的体系结构 用户空间包含一些应用程序(例如,文件系统的使用者)和 GNU C 库(glibc),它们为文件系统调用(打开.读取.写和关闭)提供用户接口.系统调用接口的 ...

  8. linux内核体系结构

    linux内核第一记   1.linux体系结构   从上图可知,Linux分为:用户空间和内核空间.内核空间和用户空间是程序执行的两种不同的状态,通过系统调用和硬件中断能够完成从用户空间到内核空间的 ...

  9. Linux中断体系结构

    1.中断处理体系结构 Linux内核将所有中断统一编号,使用一个irq_desc结构数组来描述这些中断. 数组声明在/linux/kernel/irq/handle.c中,其中#define NR_I ...

随机推荐

  1. Net Core构建Angular4应用程序

    在Visual Studio 2017中使用Asp.Net Core构建Angular4应用程序   前言 Visual Studio 2017已经发布了很久了.做为集成了Asp.Net Core 1 ...

  2. NetCore上传多文件

    .NetCore上传多文件的几种示例   本章和大家分享的是.NetCore的MVC框架上传文件的示例,主要讲的内容有:form方式提交上传,ajax上传,ajax提交+上传进度效果,Task并行处理 ...

  3. UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position 9865: illegal multibyte sequence 解决办法

    解决办法 ; a=r.text.replace('\xa0',' ') 详情参见https://stackoverflow.com/questions/10993612/python-removing ...

  4. python Fuction 方法的调用

    def display():#无参数 print("No") return # display() def callfun():#调用 print("2") d ...

  5. plsql连接远程数据库快捷方式

    不用修改任何文件就可以直接连接远程数据库

  6. 09SpringAopAdvice

    Spring原生的经典模式 实现 AOP 通知: 前置通知:在目标方法执行之前执行,不能改变方法的执行流程和结果! 实现 MethodBeforeAdvice接口! 后置通知:在目标方法执行之后执行, ...

  7. Java @Validated 遇到的大坑

    我在一个Controller内,在两个方法内使用@Validated,这是两个POST方法会进入的方法,这两个方法的实体类的命名(下图红框内容)不能一样,一样的话就会导致第二个在页面显示不出来错误信息 ...

  8. 开机报错 the connected AC adapter has a lower wattage than the recommended model which was shipped with the system。

    机型:联想Thinkpad T410 报错场景:在电脑插上电源充电情况下开机,会自动进入bios setup utility提示你需要重新设置日期时间.date/time 报错提示:The conne ...

  9. webpack相关插件

    webpack-merge:开发环境和生产环节的webpaak配置文件的配置合并 file-loader:编译写入文件,默认情况下生成文件的文件名是文件名与MD5哈希值的组合 vue-laoder:编 ...

  10. 1044 拦截导弹 1999年NOIP全国联赛提高组 个人博客:attack.cf

    1044 拦截导弹 1999年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold         题目描述 Description 某国为了防御敌 ...