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

 转载请注明出处: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内部软件中断。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值