码迷,mamicode.com
首页 > 系统相关 > 详细

Linux内核(二)中断基本概念

时间:2015-06-21 18:33:33      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:

 转载请注明出处:jiq?钦‘s technical Blog 

技术分享

 

首先解释一些容易混淆的概念:

 

中断上下文:正在执行ISR或者下半部。没有进程背景(只是暂停CPU去内存中其他地方执行一段快速代码),所以不能被切换(比如睡眠,被其他进程抢占等都不行)

进程上下文:非中断上下文(比如执行系统调用或者内核线程的时候)。此时内核代表线程在执行,所以允许睡眠,被抢占等(被切换)

中断栈:每个处理器有一个专门的中断栈。以前中断处理程序都是使用中断进程的内核栈(只有一个),但是内核栈越来越不够用,所以中断处理程序有了自己的栈---中断栈,每个处理器一个。

中断源:

(a) 外设请求(通过中断线,CPUINTR引脚接收信号)

(b) 定时器时间到(可编程定时器完成计时任务)

(c) 硬件故障和程序出错;

(d) 软件中断(软件中断指令产生,是程序实现安排好的)

 

中断类型:

(1)硬件中断(外部中断)由硬件产生的异步中断,不知道什么时候会到来。

(e)可屏蔽中断:从INTR引脚接收的信号。一般是由外设发送过来。可以被屏蔽,如果被屏蔽掉了,中断控制器会在寄存器中某个位记录这一请求,等到中断被开启时再去驱动CPUINTR。如果同一时刻有多个中断请求,则中断控制器会先向CPU报告优先级高的中断,然后再报告优先级低的。

可以有三种方式关闭外部可屏蔽中断:

---通过cli指令将标志寄存器中IF位清零,关闭所有中断线。

注意请中断指令只是关闭中断线,不会影响软件中断和不可屏蔽中断;

---通过中断控制器中的终端屏蔽寄存器,屏蔽掉某一特定的中断线(IRQn)

---通过设备的设备控制寄存器控制该设备是否发出中断,屏蔽单个设备;

可屏蔽中断响应时间:

CPU接收到INTR引脚传来的信号时,必须具备以下四个条件才予以响应:

(1) 无总线请求;

(2) 无非屏蔽中断请求;

(3) CPU允许中断;

(4) CPU执行完现行指令;

 

(f)不可屏蔽中断:例如CPU掉电等;

非屏蔽中断响应时间:

CPU接收到来自NMI引脚传来的信号,必须具备以下两个条件才予以响应:

(1) 无总线请求;

(2) CPU执行完现行指令;

 

(2)软件中断(内部中断)CPU内部指令产生,是同步中断(CPU的角度看)

(a)Fault:指令执行出错;

(b)Traps:通过中断描述符表预定,例如INT3等,相当于立即执行一条跳转指令,跳转到ISR入口地址

(c)Aborts:严重错误;

 

中断向量划分:

中断向量是8位的,总共可以有256(0-255)项,处理器使用0-31号作为内部中断,而其余的可以自由使用。一般8259AIRQ0使用32IRQ1使用33。。。Linux中使用Int 0x80作为系统调用。

 

中断的初始化:

不同硬件系统有不同的终端控制器,因此内核定义了一个irq_chip结构来描述中断控制器,内核无需关心具体细节。设备驱动程序只需要参照其datasheet,提供硬件相关的操作函数,定义一个irq_chip对象就可以了。

 

关中断指令CLI:

    并不会影响软件中断(INT0x80),因为关中断是清除中断请求寄存器的相应位,即禁止中断线,只能关闭外部硬件中断,而不能影响CPU内部软件中断。

Linux内核(二)中断基本概念

标签:

原文地址:http://blog.csdn.net/jiyiqinlovexx/article/details/46582737

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!