Chinaunix首页 | 论坛 | 博客
  • 博客访问: 177432
  • 博文数量: 30
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 440
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-23 19:45
文章分类

全部博文(30)

文章存档

2016年(2)

2010年(3)

2009年(8)

2008年(17)

我的朋友

分类: LINUX

2009-04-21 15:47:51

中断概述:
什么是中断,简单地说就是CPU在忙着作自己的事情,这时候硬件(比如说键盘按了一下)触发了一个电信号,这个信号通过中断线到达中断控制器8259A,8259A接受到这个信号,向CPU发送INT信号申请CPU来执行刚才的硬件操作,并且将中断类型号也发给CPU,此时CPU就丢下自己正在做的事情,但不是随便丢到旁边而是保存了当前正在做的事情的相关资料,然后去处理这个申请,根据中断类型号找到它的中断向量(也就是中断程序在内存中的地址),然后去执行这段程序(这段程序是已经写好的,在内存中),执行完后再向8259A发送一个INTA信号表示我已经处理完你刚才的申请。这个时候CPU就可以继续做它刚才被打断做的事情了,这个时候刚才保存的相关信息就帮助CPU接着执行下面的程序,而不至于忘记自己刚才正在做什么。
上面说了一大堆关键词有四个:
中断源:这里的中断源是指打断CPU的事件,没有中断源中断无从谈起,它可以是硬件的也可以是软件的。
CPU:不用说中断就是要来用CPU来处理一些事情的
中断控制器8259A:硬件中断源与CPU之间的桥梁,没有它中断就无法被CPU所知道。
中断服务程序:你打断了CPU,CPU就得根据这个程序来为你办事

中断的分类:
上面概述中提到的中断只是中断家族中的一种叫硬件中断,总的来说可以将中断分为内部中断和外部中断,内部中断也叫软中断是由CPU产生的,当处理起执行时遇到了由于程序员编程而导致的错误指令时,如除数为0,这些就会产生内部中断,而外部中断(硬件中断)一般都是硬件所引起的中断比如说键盘等。
中断控制器8259A:


说中断不得 不说8259A,系统外设的中断都是由它来控制和管理的,图中是由两片8259A级联组成的,可以响应15个中断源。由图可以看出硬件接在8259A的中断请求线上。
中断号:
这里所说的中断号是指外部中断即硬件中断的编号,系统为每个“中断请求线”分配了一个号,x86采用了两个8259A,一共有15个中断号,但是随着外设的增加,这些肯定不能满足需求,所以就有了多个外设共享一个中断号。中断号是用来表明是那个设备产生了中断,比如作为时钟中断的IRQ0。这样CPU就可以知道是那个设备产生了中断从而去处理它。
中断向量:
Inter x86共支持256个向量中断,为了很容易的识别每种中断源将它们从0到255进行编号,Inter将这个整数叫做中断向量,Linux对这256个中断向量的分配如下:
0~31为异常和非屏蔽中断
32~47为可屏蔽中断(硬件中断)
48~255用来表示软中断,Linux只用了其中的一个(即128或0x80向量)作为系统调用。
前面所将的中断号与中断向量之间的关系是:中断号+32 = 中断向量。中断向量的作用将在下面介绍。
中断描述符表(IDT):一个表,也叫中断向量表,每个表项叫做门描述符(gate descriptor)占8个字节,简单的说是用来存放中断处理程序入口函数地址,当然还包括了一些其他信息。其作用就是当一个中断发生时我们根据它的中断号确定其中断向量,然后在此表中找到它的入口函数从而执行它。这个表存放在内存中的一片区域中,那么我们如何找到这个表呢?这就需要一个系统寄存器中断描述符寄存器IDTR,在系统初始化时有一条汇编指令LIDT便可将中断描述符表的地址装进IDTR中,IDTR48位,在低字(低16位)中装的是界限,在高双字(高32位)中装的是基址。



阅读(2704) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

chinaunix网友2009-04-22 11:32:20

叙述的很形象~