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) 若发

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值