arm linux 中断 分析,armlinux中断异常的处理分析.pdf

基于 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 引脚相连。

设备

设备

控制器

中断

控制器

IRQ

CPU

INTR

中断向量 每个中断和异常由 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) 若发

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453304.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(数据科学学习手札03)Python与R在随机数生成上的异同

随机数的使用是很多算法的关键步骤,例如蒙特卡洛法、遗传算法中的轮盘赌法的过程,因此对于任意一种语言,掌握其各类型随机数生成的方法至关重要,Python与R在随机数底层生成上都依靠梅森旋转(twister)来生成…

音视频编解码知识学习详解(分多部分进行详细分析)

1. 常用的基本知识 基本概念 编解码 编解码器(codec)指的是一个能够对一个信号或者一个数据流进行变换的设备或者程序。这里指的变换既包括将信号或者数据流进行编码(通常是为了传输、存储或者加密)或者提取得到一个编码流的操作…

二叉树非递归后序遍历算法

与正常的非递归中序遍历算法不同于两点: 一 比正常的中序遍历算法多了对数据元素的标记。 在压数据元素入栈(标记记为0,用来表示访问了其左子树)时标记, 还有访问完左子树利用gettop()获取双亲…

SQL*Plus命令

SQL*Plus命令 前言 一:SQL*Plus 与数据库的交互 二:设置SQL* Plus的运行环境 二 - 1 :SET命令概述 二 - 2 :使用SET命令设置运行环境 二 - 2 ____1:Pagesize 变量 1 SYSorcl> show pagesize2 pages…

redis-day1

1 Redis 概述 REmote DIctionary Server(Redis)是一个基于key-value键值对的持久化数据库存储系统。redis和大名鼎鼎的Memcached缓存服务软件很像,但是Redis支持的数据存储类型比Memcached更丰富,包括strings(字符串)、lists&…

C语言数码管是共阴共阳程序,C语言实现共阴极数码管操作

共阴极或者共阳极数码管,因为其需要电流大,而一般51输出电流低,需要锁存器。买的开发板使用的共阴极数码管。至于其构造,找个相关方面的书看看,这里主要是对做好的电路板进行编程。刚开始的时候,感觉在数码…

数据库主要特点

(1)实现数据共享。数据共享包含所有用户可同时存取数据库中的数据,也包括用户可以用各种方式通过接口使用数据库,并提供数据共享。 (2)减少数据的冗余度。同文件系统相比,由于数据库实现了数据共享,从而避免了用户各自建立应用文…

百度与华为全面战略合作 人工智能手机真的要来了

视频加载中...12月21日百度和华为在北京宣布达成全面战略合作。这次合作内容主要包括三点,首先是在语音、语义、视觉和VR上的自然交互,这是百度为华为手机AI赋能的基础层。第二是基于华为HiAI平台和百度PaddlePaddle深度学习框架,共建人工智能…

JavaScript数据类型

一、JavaScript数据类型主要分为原始类型和引用数据类型。 原始类型包括(不可拆分的东西):Number、String、Boolean、Null、Undefined。引用数据类型包括:Object(Array,Date,RegExp,Function)ty…

funcode拼图游戏c语言程序,同求funcode平台下拼图游戏的C语言代码

做了好几天,写了好多回就是不对,彻底崩溃。。#include "CommonAPI.h"//#include "LessonX.h"#include#define BLOCK_COUNT 4int g_iGameState;intg_iBlockState[BLOCK_COUNT][BLOCK_COUNT];charg_szBlockName[BLOCK_COUNT*BLOCK_COU…

什么是透明传输

透明传输是指不管所传数据是什么样的比特组合,都应当能够在链路上传送。当所传数据中的比特组合恰巧与某一个控制信息完全一样时,就必须采取适当的措施,使收方不会将这样的数据误认为是某种控制信息。这样才能保证数据链路层的传输是透明的。…

Android 秒级编译FreeLine

项目地址:FreeLine FreeLine官网: FreeLine 1. 安装FreeLine插件 File->Settings->Plugins, 搜索输入FreeLine Plugin, 查找到后进行安装并重启Android Studio。 图1.png安装好之后,在工具栏就会出一个图标 图2.png2. 配置gradle 根目录build.gr…

JS实现大整数乘法(性能优化、正负整数)

本方法的思路为: 一:检查了输入的合法性(非空,无非法字符) 二:检查输入是否可以进行简单计算(一个数为 0,1,1,-1) 三:去掉输入最前面可…

c语言中- gt he,C语言中deta,fabs,lt;stdlib.hgt;,lt;stdio.hgt;分别是什么意思

fabs 编辑本段C语言数学函数:fabs 函数简介  原型:在TC中原型是extern float fabs(float x);,在VC6.0中原型是double fabs( double x );。   用法:#include   功能:求浮点数x的绝对值   说明:计算|x|, 当x不为…

物理层

目的: 物理层要尽可能地屏蔽掉物理设备和传输媒体,通信手段的不同,使数据链路层感觉不到这些差异,只考虑完成本层的协议和服务。 给其服务用户(数据链路层)在一条物理的传输媒体上传送和接收比特流…

C语言中的二级指针(双指针)

二级指针又叫双指针。C语言中不存在引用,所以当你试图改变一个指针的值的时候必须使用二级指针。C中可以使用引用类型来实现。 下面讲解C中的二级指针的使用方法。 例如我们使用指针来交换两个整型变量的值。 错误代码如下: 一级指针 [cpp] view pla…

测试环境服务器硬盘塞满问题排查

项目中出现的问题 某天下午测试环境服务器出现tab无法补全命令,给出的提示大概意思就是说,无可用空间无法创建临时文件,不过这次跟上次出现的问题比较像,上次服务器出现的问题,因此楼主判断可能是服务器数据盘被占满,果…

alpine_glibc 构建sun jdk 8的docker镜像

2019独角兽企业重金招聘Python工程师标准>>> 构建系统基础镜像 alpine glibc 的Dockerfile内容如下&#xff1a; alpine:3.6 MAINTAINER tongqiang<tongqiangyingmail.com># Here we install GNU libc (aka glibc) and set C.UTF-8 locale as default.ENV ALP…

单工 半双工 全双工

1 单工 单工就是指A只能发信号&#xff0c;而B只能接收信号&#xff0c;通信是单向的&#xff0c;就象灯塔之于航船——灯塔发出光信号而航船只能接收信号以确保自己行驶在正确的航线上。 2 半双工 半双工就是指A能发信号给B&#xff0c;B也能发信号给A&#xff0c;但这两…

c语言两个循环的ys,c语言编程:从键盘输入两个数,求它们的最小公倍数

满意答案flywisdom2019.06.20采纳率&#xff1a;44% 等级&#xff1a;9已帮助&#xff1a;1064人main(){int p,r,n,m,temp;printf("Please enter 2 numbers n,m:");scanf("%d,%d",&n,&m);//输入两个正整数.if(n{tempn;nm;mtemp;}pn*m;//P是原来…