1.异常中断概述

在arm架构的处理器中,cpu有7中工作模式,2中工作状态。

1.CPU模式(Mode):

  1. 7Mode: 除了usr/sys,其他5种都是异常模式。我们知道中断属于异常的2中,中断有irq,fiq
usr sys undefined(und) Supervisor(svc) Abort(abt) irq fiq
用户模式 系统模式 未定义指令异常模 svc管理模式 终止模式(1.指令预取终止(读写某条错误的指令导致终止运行);2.数据访问终止(读写某个非法地址程序终止)) irq中断 快中断

除了usr模式,其他6中为特权模式。 CPU无法从usr模式直接进入特权模式。不能直接进入特权模式,那么怎么进入特权模式呢?

可以通过设置CPSR(后面会讲)进入其他模式。

2种工作State:

  1. ARM state
  2. Thumb state(几乎用不上)

3.寄存器:

  1. (1)通用寄存器:
  2. (2)备份寄存器(banked register):
  3. CPSR:当前程序状态寄存器(Current Program Status Register) 反映程序处在那种状态
  4. SPSR:CPSR的备份寄存器 (Saved Program Status Register) 用来保存"被中断前的CPSR"

下图是我们arm状态下的通用寄存器和程序状态寄存器

R13是SP(栈指针)

R14是LR(link register),程序跳转或者发成异常时的返回地址

R15是PC(程序计数器)

假设cpu执行:

  1. mov R0, R8
  2. mov R0,R8_fiq

在usr/System 模式下访问的R8, 但是在FIQ模式下,访问R8是访问FIQ模式专属的R8寄存器,不是同一个物理上的寄存器。

在5种异常模式中每个模式都有自己专属的R13 R14寄存器,R13用作SP(栈), R14(LR)是用来保存发生异常时的指令地址。

为什么快中断(FIQ)有那么多专属寄存器?

这些寄存器称为备份寄存器,我们先看下中断处理流程

  1. 1 保存现场(保存被中断模式的寄存器)---(比如程序正在sys/usr模式下运行,当发生中断时,需要把R0-R14这些寄存器全部保存下来)
  2. 2 异常处理(去分辨是哪一个中断源产生了中断,去执行对应的中断服务程序)
  3. 3 恢复现场(恢复被中断时保存下来的寄存器R0-R14)

但如果是快中断,那么我就不需要保存系统/用户模式下的R8 ~ R12这几个寄存器,因为在FIQ模式下有自己专属的R8 ~ R12寄存器,省略保存寄存器的时间,加快处理速度,所以它才称得上快中断。

PSR程序状态寄存器

在异常中断中PSR寄存器会使用的很频繁,PSR寄存器的格式如下图:

我们再来看看下表,反映的是PSR的 M[4:0]与arm工作模式的关系:

我们可以按照上图的对应关系设置CPSR,让其进入与之对应的模式。

4.异常向量表:

异常向量:不同的异常有不同的入口函数,那么这个异常入口函数的地址就是存放在该异常向量的位置。从该异常向量读取到的数据就是异常入口函数的地址。

异常向量表就是由异常向量组成的集合。

下图是我从uboot源代码中截取的smdk2410 的异常向量表:(2440异常向量表也是这个)

  1. .globl _start
  2. _start: b reset
  3. ldr pc, _undefined_instruction
  4. ldr pc, _software_interrupt
  5. ldr pc, _prefetch_abort
  6. ldr pc, _data_abort
  7. ldr pc, _not_used
  8. ldr pc, _irq
  9. ldr pc, _fiq

异常向量表对应的地址如下图:

2.异常处理流程

CPU是如何进入到中断模式,执行中断服务程序的?

1.中断前:

下图是中断未触发前的程序执行过程:

那么如何初始化中断?

  1. 1,设置中断源(使中断能够产生,让CPU知道是哪个中断)
  2. 2,设置中断控制器(设置中断屏蔽,中断优先级)
  3. 3,设置中断总开关CPSR (使能中断)

2.中断产生后:

举个栗子:按键按下,产生按键irq。

硬件上的处理流程:

cpu强制跳转到异常向量表上对应的_irq异常向量(0x18)去读取指令(这个是CPU强制执行的,不需要我们去控制)。

具体的进入中断向量和中断返回流程见下图:

  1. 进入:
  2. (1) LR_异常=PC + offset(具体多少看下图)
  3. 2SPSR_异常=被中断前的程序模式CPSR
  4. (3) CPSR被设置成对应的异常模式
  5. 4)跳转到对应的异常向量去执行
  6. 退出(返回):进入和退出就是一个逆过程
  7. 1PC= LR_异常 -offset
  8. 2)被中断前的程序模式CPSR = SPSR_异常
  9. 3)中断结束,清中断

进入异常和返回异常时pc和lr的关系如下图:

从图中我们发现进入不同异常,offset的值也是有差异的。

软件上的处理流程:

  1. 1.当跳转到irq异常向量(0x18)后,发现该处是一条跳转指令“ldr pc, _irq”,
  2. 那么会通过ldr绝对跳转指令跳到到真正的中断处理函数_irq去执行。
  3. 2.那么在_irq的函数中我们需要按照之前说的**中断处理流程**去执行:
  4. 1)保存现场
  5. 2)异常处理(去分辨是哪一个中断源产生了中断,去执行对应的中断服务程序)
  6. 3)恢复现场

下面用流程图总结下中断产生后的详细处理过程:

s3c2440裸机-异常中断(一. 异常、中断的原理与流程)的更多相关文章

  1. linux中断与异常

    看了<深入理解linux内核>的中断与异常,简单总结了下,如果有错误,望指正! 一 什么是中断和异常 异常又叫同步中断,是当指令执行时由cpu控制单元产生的,之所以称之为异常,是因为只有在 ...

  2. ASM:《X86汇编语言-从实模式到保护模式》第17章:保护模式下中断和异常的处理与抢占式多任务

    ★PART1:中断和异常概述 1. 中断(Interrupt) 中断包括硬件中断和软中断.硬件中断是由外围设备发出的中断信号引发的,以请求处理器提供服务.当I/O接口发出中断请求的时候,会被像8259 ...

  3. Linux的中断 & 中断和异常的区别

    参考 http://www.yesky.com/20010813/192117.shtml 结构化程序设计思想认为:程序 = 数据结构 + 算法.数据结构体现了整个系统的构架,所以数据结构通常都是代码 ...

  4. Linux内核中断和异常分析(中)

    在linux内核中,每一个能够发出中断请求的硬件设备控制器都有一条名为IRQ的输出线.所有现在存在的IRQ线都与一个名为可编程中断控制器的硬件电路的输入引脚相连,上次讲到单片机的时候,我就讲到了单片机 ...

  5. Linux内核中断和异常分析(上)

    中断,通常被定义为一个事件.打个比方,你烧热水,水沸腾了,这时候你要去关掉烧热水的电磁炉,然后再去办之前手中停不下来的事情.那么热水沸腾就是打断你正常工作的一个信号机制.当然,还有其它的情况,我们以后 ...

  6. 深入理解Linux内核-中断和异常

    Linux内核代码查看 http://androidxref.com/ 中断:被定义位一个事件,它能改变处理器执行指令的顺序.它对应硬件(CPU.其他硬件设备)电路产生的电信号. 同步中断:指令执行时 ...

  7. 《LINUX3.0内核源代码分析》第二章:中断和异常 【转】

    转自:http://blog.chinaunix.net/uid-25845340-id-2982887.html 摘要:第二章主要讲述linux如何处理ARM cortex A9多核处理器的中断.异 ...

  8. 《深入理解Linux内核》阅读笔记 --- 第四章 中断和异常

    1.中断的作用:中断信号提供了一种方式,使处理器转而去运行正常控制流之外的代码.当一个中断信号到达时,CPU必须停止它当前所做的事,并切换到一个新的活动.为了做到这一点,就要在内核态堆栈保存程序计数器 ...

  9. x86保护模式-七中断和异常

    x86保护模式-七中断和异常 386相比较之前的cpu   增强了中断处理能力   并且引入了 异常概念 一 80386的中断和异常 为了支持多任务和虚拟存储器等功能,386把外部中断称为中断     ...

随机推荐

  1. AtCoder-3856

    An adult game master and N children are playing a game on an ice rink. The game consists of K rounds ...

  2. windows上安装和使用ab压测工具

    ApacheBench是一款压力测试工具,用于测试http服务器请求的性能情况. 官方下载链接:https://www.apachehaus.com/cgi-bin/download.plx 百度云: ...

  3. MacOS下制作linux启动盘

    在Windows下,我们经常使用软碟通来制作各种系统的启动盘,那么在MacOS下,如何做到呢?MacOS跟Linux的做法基本一致.如果你只想快速地制作好启动盘,请看下面的快速版 首先,你需要以下两样 ...

  4. 【重温基础】15.JS对象介绍

    从这篇文章开始,复习 MDN 中级教程 的内容了,在初级教程中,我和大家分享了一些比较简单基础的知识点,并放在我的 [Cute-JavaScript]系列文章中. 关于[Cute-JavaScript ...

  5. Orleans[NET Core 3.1] 学习笔记(四)( 1 )创建项目

    ClassRoom ClassRoom是一个练手demo,目的是为了能熟悉掌握Orleans的基本知识和使用方法,我会尽量在这个项目中加入更多的知识点,一边学一边练避免我看完文档就忘掉 创建项目 依旧 ...

  6. rails gem ransack 之模糊搜索

    gem 'ransack' eq: "等于" eq_any: "等于任意值" eq_all: "等于所有值" not_eq: "不 ...

  7. hikari连接池属性详解

    hikari连接池属性详解 一.主要配置 1.dataSourceClassName 这是DataSourceJDBC驱动程序提供的类的名称.请查阅您的特定JDBC驱动程序的文档以获取此类名称,或参阅 ...

  8. 【Jackson】使用学习

    Jackson学习 文档:http://tutorials.jenkov.com/java-json/index.html https://github.com/FasterXML/jackson/w ...

  9. 【Java Web开发学习】Spring MVC整合WebSocket通信

    Spring MVC整合WebSocket通信 目录 ========================================================================= ...

  10. 面试BAT前先搞定这18道MySQL经典面试题(含答案解析)

    一.MySQL的复制原理以及流程 (1)复制基本原理流程 1. 主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中: 2. 从:io线程——在使用start ...